Std :: vector <T> é um `tipo definido pelo usuário`?

Nos pontos 17.6.4.2.1 / 1 e 17.6.4.2.1 / 2 doesboço atual padrão restrições são impostas às especializações injetadas pelos usuários emnamespace std.

O comportamento de um programa C ++ é indefinido se ele incluir declarações ou definições no namespace std ou em um namespace dentro do namespace std, a menos que seja especificado de outra forma. Um programa pode adicionar uma especialização de modelo para qualquer modelo de biblioteca padrão ao namespace std apenas se a declaração depender de umtipo definido pelo usuário e a especialização atende aos requisitos da biblioteca padrão para o modelo original e não é explicitamente proibida.

Não consigo encontrar onde, no padrão, a frasetipo definido pelo usuário é definido.

Uma opção que ouvi alegar é que um tipo que não éstd::is_fundamental é umtipo definido pelo usuário, nesse casostd::vector<int> seria umtipo definido pelo usuário.

Uma resposta alternativa seria que umtipo definido pelo usuário é um tipo que um usuário define. Como os usuários não definemstd::vector<int>estd::vector<int> não depende de nenhum tipo definido pelo usuário,std::vector<int> não é umtipo definido pelo usuário.

Um problema prático que isso impacta é "você pode injetar uma especialização parastd::hash parastd::tuple<Ts...> para dentronamespace std? Ser capaz de fazer isso é um tanto conveniente - a alternativa é criar outro espaço para nome onde construímos recursivamente nosso hash parastd::tuple (e possivelmente outros tipos emstd que não temhash suporte) e, se e somente se não conseguirmos encontrar um hash nesse espaço de nome, voltaremos astd.

No entanto, se isso for legal, se e quando o padrão incluir umhash especialização parastd::tuple paranamespace std, o código especializado já estaria quebrado, criando um motivo para não adicionar essas especializações no futuro.

Enquanto eu estou falando sobrestd::vector<int> como exemplo concreto, estou tentando perguntar se os tipos definidos emstd são sempretipo definido pelo usuário s. Uma questão secundária é, mesmo que não, talvezstd::tuple<int> torna-se umtipo definido pelo usuário quando usado por um usuário (isso fica escorregadio: o que acontece se algo dentrostd definestd::tuple<int>e você se especializa parcialmentehash parastd::tuple<Ts...>)

Existe atualmente umdefeito aberto sobre este problema.

questionAnswers(4)

yourAnswerToTheQuestion