Decltype ne devrait-il pas déclencher la compilation de l’argument?

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

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.