En citant librement la norme :
-
numeric_limits
ne doit pas être spécialisée pour les types standards non arithmétiques (par exemple complex<T>
)
-
"[S]es spécialisations de shared_ptr
doivent être copiables, cessibles et moins que comparables [et] convertibles en bool
."
-
"Spécialisations de weak_ptr
doivent être copiables et cessibles."
-
"[L]es spécialisations classiques [des std::hash
] doit répondre aux exigences du modèle de classe hachuré. "
-
Tout ce qui est dans <type_traits>
: "Le comportement d'un programme qui ajoute des spécialisations pour l'un des modèles de classe définis dans cette sous-clause est indéfini, sauf indication contraire." (seules certaines spécialisations de common_type
sont explicitement autorisées)
-
Les locaux ont certains requis les spécialisations.
-
Toutes les spécialisations de istreambuf_iterator
doit avoir un constructeur trivial de copie, un constructeur par défaut constexpr, et un destructeur trivial.
-
"L'effet de l'instanciation du modèle de classe complex
pour tout type autre que float, double, ou long double n'est pas spécifié." Je suppose que cela signifie que la définition de ces autres spécialisations est inutile.
-
"Les spécialisations et instanciations de la atomic
Le modèle doit avoir un constructeur de copie supprimée, un opérateur d'affectation de copie supprimée et un constructeur de valeur constexpr".
-
"Les modèles de classe unary_function
et binary_function
sont dépréciées. Un programme ne doit pas déclarer de spécialisations de ces modèles."
Et bien sûr la clause primordiale 17.6.4.2.1, phrase 1 (merci @sehe et @curiousguy) :
Le comportement d'un programme C++ est indéfini s'il ajoute des déclarations ou des définitions à l'espace de noms std ou à un espace de noms à l'intérieur de l'espace de noms std. dans l'espace de noms std, sauf indication contraire. Un programme peut ajouter une spécialisation de modèle pour tout modèle de la bibliothèque standard dans l'espace de noms std uniquement si la déclaration dépend d'un type défini par l'utilisateur et que la spécialisation répond aux exigences de la bibliothèque standard pour le modèle original et n'est pas explicitement interdite.
Et la phrase 2 :
Le comportement d'un programme C++ est indéfini s'il déclare
-
une spécialisation explicite de toute fonction membre d'un modèle de classe de la bibliothèque standard, ou
-
une spécialisation explicite de tout modèle de fonction membre d'une classe ou d'un modèle de classe de la bibliothèque standard, ou
-
une spécialisation explicite ou partielle de tout modèle de classe membre d'une classe ou d'un modèle de classe de la bibliothèque standard.
Un programme peut instancier explicitement un modèle défini dans la bibliothèque standard uniquement si la déclaration dépend du nom d'un type défini par l'utilisateur et que l'instanciation répond aux exigences de la bibliothèque standard pour le modèle original.