Ist std :: vector <T> ein benutzerdefinierter Typ?

In 17.6.4.2.1 / 1 und 17.6.4.2.1 / 2 deraktueller Normentwurf Einschränkungen gelten für Spezialisierungen, in die Benutzer injizierennamespace std.

Das Verhalten eines C ++ - Programms ist undefiniert, wenn es Deklarationen oder Definitionen zum Namespace std oder zu einem Namespace innerhalb des Namespace std hinzufügt, sofern nichts anderes angegeben ist. Ein Programm kann dem Namespace std nur dann eine Vorlagenspezialisierung für eine Standardbibliotheksvorlage hinzufügen, wenn die Deklaration von a abhängtbenutzerdefinierter Typ Die Spezialisierung entspricht den Anforderungen der Standardbibliothek für die Originalvorlage und ist nicht ausdrücklich untersagt.

Ich kann nicht finden, wo in der Norm die Phrasebenutzerdefinierter Typ ist definiert.

Eine Option, die ich gehört habe, ist, dass ein Typ das nicht iststd::is_fundamental ist einbenutzerdefinierter Typ, in welchem Fallstd::vector<int> wäre einbenutzerdefinierter Typ.

Eine alternative Antwort wäre, dass abenutzerdefinierter Typ ist ein Typ, den ein Benutzer definiert. Als Benutzer nicht definierenstd::vector<int>, undstd::vector<int> ist nicht abhängig von einem Typ, den ein Benutzer definiert,std::vector<int> ist keinbenutzerdefinierter Typ.

Ein praktisches Problem, auf das sich dies auswirkt, ist "Können Sie eine Spezialisierung für injizieren?"std::hash zumstd::tuple<Ts...> innamespace std? Dies zu tun ist etwas bequem - die Alternative besteht darin, einen anderen Namespace zu erstellen, für den wir unseren Hash rekursiv erstellenstd::tuple (und möglicherweise andere Typen instd das muss nichthash support), und wenn und nur wenn wir keinen Hash in diesem Namespace finden, greifen wir darauf zurückstd.

Wenn dies jedoch legal ist, fügt der Standard a hinzuhash Spezialisierung fürstd::tuple zunamespace std, Code, der sich darauf spezialisiert hat, wäre bereits fehlerhaft, was einen Grund dafür darstellt, solche Spezialisierungen in Zukunft nicht mehr hinzuzufügen.

Während ich redestd::vector<int> Als konkretes Beispiel versuche ich zu fragen, ob Typen in definiert sindstd sind immerbenutzerdefinierter Typ s. Eine zweite Frage ist, wenn auch nicht, vielleichtstd::tuple<int> wird zu einerbenutzerdefinierter Typ wenn von einem Benutzer verwendet (dies wird rutschig: was passiert dann, wenn etwas drin ist?std definiertstd::tuple<int>und Sie sind teilweise spezialisierthash zumstd::tuple<Ts...>).

Derzeit gibt es eineoffener Defekt zu diesem Problem.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage