Acabei de assistir a palestra de Stephan T. Lavavej CppCon 2018
em "Class Template Argument Deduction", onde em algum momento ele disse incidentalmente:
Em C ++, as informações de tipo quase nunca fluem para trás ... Eu tive que dizer "quase" porque há um ou dois casos, possivelmente mais, mas muito poucos .
Apesar de tentar descobrir a quais casos ele se referia, não consegui pensar em nada. Daí a pergunta:
Em quais casos o padrão C ++ 17 exige que as informações de tipo se propaguem para trás?
c++
types
language-lawyer
c++17
type-deduction
Massimiliano
fonte
fonte
Respostas:
Aqui está pelo menos um caso:
se o fizer
foo f; int x = f; double y = f;
, as informações de tipo fluirão "para trás" para descobrir o queT
está dentrooperator T
.Você pode usar isso de uma forma mais avançada:
então agora eu posso fazer
e funciona.
Claro, por que não fazer
{1,2,3}
? Bem,{1,2,3}
não é uma expressão.que, reconhecidamente, exige um pouco mais de magia: exemplo ao vivo . (Eu tenho que fazer o deduzir retorno fazer uma verificação SFINAE de F, então fazer o F ser SFINAE amigável, e eu tenho que bloquear std :: initializer_list no operador deduce_return_t T.)
fonte
&&
qualificador nooperator T()
é um ótimo toque; ajuda a evitar a interação deficiente comauto
, causando um erro de compilação seauto
for mal utilizado aqui.Stephan T. Lavavej explicou o caso que ele estava falando em um tweet :
podemos ver exemplos disso na página cppreference em Endereço da função sobrecarregada , exceto alguns abaixo:
Michael Park adiciona :
e fornece este exemplo ao vivo :
que elaborei um pouco mais aqui .
fonte
Acredito na conversão estática de funções sobrecarregadas, o fluxo vai na direção oposta, como na resolução de sobrecarga usual. Então, um desses está ao contrário, eu acho.
fonte