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.