c++ templates compilation language-lawyer decltype

c++ - ¿No debería decltylear la compilación desencadenante de su argumento?



templates compilation (2)

Así que estoy perplejo en cuanto a cómo funciona esto. Dado:

template <typename T> int foo(T t) { t.foo(); }

Parece que esta llamada debería fallar:

decltype(foo(int{ 13 })) fail = 42; cout << fail << endl;

En su lugar , simplemente se imprime :

42

Funciona de esta manera en todos los compiladores a los que tengo acceso. ¿Es este el comportamiento correcto? Solicito una cotización del Estándar C ++.


En [dcl.spec] :

Para una expresión e, el tipo denotado por decltype (e) se define de la siguiente manera:

si e es una expresión-expresión sin paréntesis que nombra un lvalor o referencia introducida desde la lista de identificadores de una declaración de descomposición, decltype (e) es el tipo al que se hace referencia en la especificación de la declaración de descomposición ([dcl.decomp]);

de lo contrario, si e es una expresión-id sin paréntesis o un acceso de miembro de clase sin paréntesis ([expr.ref]), decltype (e) es el tipo de la entidad nombrada por e. Si no existe tal entidad, o si e nombra un conjunto de funciones sobrecargadas, el programa está mal formado;

de lo contrario, si e es un xvalor, decltype (e) es T &&, donde T es el tipo de e;

de lo contrario, si e es un lvalor, decltype (e) es T &, donde T es el tipo de e;

de lo contrario, decltype (e) es el tipo de e.

El operando del especificador decltype es un operando sin evaluar (Cláusula [expr]).

(Énfasis mío)

Entonces tu foo(int{ 13 }) nunca es evaluado.


Las expresiones en decltype están definidas por el estándar para no ser evaluadas, solo se analizan para obtener el tipo de expresión.