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.