¿Es std :: vector <T> un `tipo definido por el usuario`?

En 17.6.4.2.1 / 1 y 17.6.4.2.1 / 2 de laproyecto de norma actual se imponen restricciones a las especializaciones inyectadas por los usuarios ennamespace std.

El comportamiento de un programa C ++ no está definido si agrega declaraciones o definiciones al espacio de nombres estándar o a un espacio de nombres dentro del espacio de nombres estándar, a menos que se especifique lo contrario. Un programa puede agregar una especialización de plantilla para cualquier plantilla de biblioteca estándar al espacio de nombres estándar solo si la declaración depende detipo definido por el usuario y la especialización cumple con los requisitos estándar de la biblioteca para la plantilla original y no está explícitamente prohibida.

No puedo encontrar dónde en la norma la frasetipo definido por el usuario se define.

Una opción que he escuchado es que un tipo que no esstd::is_fundamental es untipo definido por el usuario, en ese casostd::vector<int> seria untipo definido por el usuario.

Una respuesta alternativa sería que untipo definido por el usuario es un tipo que define un usuario. Como los usuarios no definenstd::vector<int>ystd::vector<int> no depende de ningún tipo que defina un usuario,std::vector<int> no es untipo definido por el usuario.

Un problema práctico que impacta es "¿puede inyectar una especialización parastd::hash parastd::tuple<Ts...> dentronamespace std? Poder hacerlo es algo conveniente: la alternativa es crear otro espacio de nombres donde construimos recursivamente nuestro hash parastd::tuple (y posiblemente otros tipos enstd que no tienehash soporte), y si y solo si no podemos encontrar un hash en ese espacio de nombres, recurrimos astd.

Sin embargo, si esto es legal, entonces si y cuando el estándar agrega unhash especialización parastd::tuple anamespace std, el código que lo especializa ya estaría roto, creando una razón para no agregar tales especializaciones en el futuro.

Mientras hablo destd::vector<int> Como ejemplo concreto, estoy tratando de preguntar si los tipos definidos enstd son alguna veztipo definido por el usuario s. Una pregunta secundaria es, incluso si no, tal vezstd::tuple<int> se convierte en untipo definido por el usuario cuando lo usa un usuario (esto se vuelve resbaladizo: qué sucede si algo dentrostd definestd::tuple<int>y te especializas parcialmentehash parastd::tuple<Ts...>)

Actualmente hay undefecto abierto en este problema

Respuestas a la pregunta(4)

Su respuesta a la pregunta