Je suis donc perplexe quant à la façon dont cela fonctionne. Donné:
template int foo(T t) { t.foo(); }
Il semble que cet appel devrait échouer:
decltype(foo(int{ 13 })) fail = 42; cout << fail << endl;
Au lieu de cela, il affiche simplement :
42
- Screenspace 3D Raycasting / Picking DirectX9
- Réinterpréter_casting une intégrale à un type de pointeur et inversement donnent-ils la même valeur?
- L’access au pointeur brut après std :: vector :: reserve est-il sécurisé?
- La compilation d’une application MFC de Visual Studio 2010 à 2012 RC génère LNK2038
- La fonction se bloque lors de l’utilisation de _mm_load_pd
Cela fonctionne de la sorte sur tous les compilateurs auxquels j’ai access. Est-ce que ce comportement est correct? Je demande un devis à la norme C ++.
Dans [dcl.spec] :
Pour une expression e, le type désigné par decltype (e) est défini comme suit:
si e est une expression id non parentisée nommant une valeur ou une référence introduite à partir de la liste d’identifiants d’une déclaration de décomposition, decltype (e) est le type référencé tel qu’il est indiqué dans la spécification de la déclaration de décomposition ([dcl.decomp]);
sinon, si e est une expression id non chiffrée ou un access membre de classe non chiffré ([expr.ref]), decltype (e) est le type de l’entité nommée par e. S’il n’existe aucune entité de ce type ou si e nomme un ensemble de fonctions surchargées, le programme est mal formé.
sinon, si e est une valeur x, decltype (e) est T &&, où T est le type de e;
sinon, si e est une valeur, decltype (e) est T &, où T est le type de e;
sinon, decltype (e) est le type de e.
L’opérande du spécificateur decltype est un opérande non évalué (Clause [expr]).
(C’est moi qui souligne)
Votre foo(int{ 13 })
n’est donc jamais évalué.
Les expressions dans decltype
sont définies par le standard pour ne pas être évaluées, elles sont uniquement analysées pour obtenir le type de l’expression.