Dans 17.6.4.2.1/1 et 17.6.4.2.1/2 de l' actuel projet de norme restrictions sont placées sur les spécialisations injecté par les utilisateurs en namespace std
.
Le comportement d'un C ++ le programme n'est pas défini si on ajoute les déclarations ou les définitions de l'espace de noms std ou à un espace de noms au sein de l'espace de noms std à moins d'indication contraire. Un programme peut ajouter un modèle de spécialisation pour toute bibliothèque standard du modèle de l'espace de noms std seulement si la déclaration dépend d'un type défini par l'utilisateur et de la spécialisation répond à la norme de la bibliothèque exigences pour le modèle d'origine et n'est pas explicitement l'interdit.
Je ne trouve pas où dans le standard de la phrase type défini par l'utilisateur est défini.
Une option que j'ai entendu revendiquée est qu'un type qui n'est pas std::is_fundamental
est un type défini par l'utilisateur, auquel cas std::vector<int>
serait un type défini par l'utilisateur.
Une alternative réponse serait qu'un type défini par l'utilisateur est un type que l'utilisateur définit. Comme les utilisateurs ne définissent pas d' std::vector<int>
, et std::vector<int>
ne dépend pas de n'importe quel type d'un utilisateur définit, std::vector<int>
n'est pas un type défini par l'utilisateur.
Un problème pratique, cet impact est "pouvez-vous injecter une spécialisation pour std::hash
pour std::tuple<Ts...>
en namespace std
? Être en mesure de le faire est peu pratique-l'alternative est de créer un autre espace de noms où nous récursivement construire notre hachage std::tuple
(et éventuellement d'autres types d' std
qui n'ont pas d' hash
de soutien), et si et seulement si nous ne parvenons pas à trouver un hash dans cet espace de noms ne nous rabattre sur l' std
.
Cependant, si c'est légal, alors, si et lorsque la norme ajoute un hash
spécialisation pour std::tuple
de namespace std
, code spécialisé, il serait déjà cassé, la création d'une raison de ne pas ajouter de telles spécialisations dans l'avenir.
Alors que je parle d' std::vector<int>
comme un exemple concret, je suis en train de vous demander si les types définis dans le std
sont jamais définis par l'utilisateur de type s. Une question secondaire, même si ce n'est, peut - std::tuple<int>
devient un type défini par l'utilisateur lorsqu'il est utilisé par un utilisateur (cela devient glissante: alors qu'advient-il si quelque chose à l'intérieur d' std
définit std::tuple<int>
, et vous partielles se spécialisent hash
pour std::tuple<Ts...>
).