56 votes

Que puis-je et ne puis-je pas spécialiser dans l'espace de noms std ?

Les utilisateurs sont autorisés à ajouter des spécialisations explicites à l'option std espace de noms. Cependant, il y a quelques modèles qu'il m'est explicitement interdit de spécialiser.

Quels sont les modèles que je peux ou ne peux pas spécialiser ?

58voto

Kerrek SB Points 194696

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X