Je viens de regarder Stephan T. Lavavej parler CppCon 2018
de "Déduction d'argument de modèle de classe", où, à un moment donné, il dit incidemment:
Dans le type C ++, les informations ne circulent presque jamais en arrière ... J'ai dû dire «presque» car il y a un ou deux cas, peut-être plus mais très peu .
Bien que j'aie essayé de comprendre à quels cas il pouvait faire référence, je ne pouvais rien trouver. D'où la question:
Dans quels cas la norme C ++ 17 exige que les informations de type se propagent à l'envers?
c++
types
language-lawyer
c++17
type-deduction
Massimiliano
la source
la source
Réponses:
Voici au moins un cas:
si vous le faites
foo f; int x = f; double y = f;
, les informations de type circuleront "en arrière" pour comprendre ce qu'ilT
y a dedansoperator T
.Vous pouvez l'utiliser de manière plus avancée:
alors maintenant je peux faire
et il fonctionne.
Bien sûr, pourquoi ne pas le faire
{1,2,3}
? Eh bien, ce{1,2,3}
n'est pas une expression.qui, certes, nécessitent un peu plus de magie: exemple en direct . (Je dois faire en sorte que le retour de déduction fasse une vérification SFINAE de F, puis rendre le F compatible avec SFINAE, et je dois bloquer std :: initializer_list dans l'opérateur deduce_return_t T.)
la source
&&
qualificatif sur leoperator T()
est une excellente touche; cela permet d'éviter la mauvaise interaction avecauto
en provoquant une erreur de compilation s'ilauto
est mal utilisé ici.Stephan T.Lavavej a expliqué le cas dont il parlait dans un tweet :
nous pouvons voir des exemples de cela à partir de la page cppreference sur l'adresse de la fonction surchargée , j'en ai excepté quelques-uns ci-dessous:
Michael Park ajoute :
et fournit cet exemple en direct :
que j'élabore un peu plus ici .
la source
Je crois que dans la diffusion statique de fonctions surchargées, le flux va dans la direction opposée comme dans la résolution de surcharge habituelle. Donc l'un de ceux-ci est à l'envers, je suppose.
la source