不应该 decltype 触发其参数的编译吗?

所以我很困惑这是如何工作的.鉴于:

So I'm perplexed as to how this works. Given:

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

这个调用似乎应该失败:

It seems like this call should fail:

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

cout << fail << endl;

取而代之的是它只是打印:

42

它在我可以访问的所有编译器上都是这样工作的.这是正确的行为吗?我向 C++ 标准请求报价.

It works this way on all the compilers I have access to. Is this correct behavior? I request a quote from the C++ Standard.

推荐答案

在 [dcl.spec] :

对于表达式e,decltype(e)表??示的类型定义为如下:

For an expression e, the type denoted by decltype(e) is defined as follows:

如果 e 是一个无括号的 id 表达式,它命名从分解的标识符列表中引入的左值或引用声明,decltype(e) 是引用类型,如在分解声明的规范([dcl.decomp]);

if e is an unparenthesized id-expression naming an lvalue or reference introduced from the identifier-list of a decomposition declaration, decltype(e) is the referenced type as given in the specification of the decomposition declaration ([dcl.decomp]);

否则,如果 e 是无括号的 id 表达式或无括号的类成员访问 ([expr.ref]),则 decltype(e) 是e 命名的实体的类型.如果没有这样的实体,或者如果 e命名一组重载函数,程序格式错误;

otherwise, if e is an unparenthesized id-expression or an unparenthesized class member access ([expr.ref]), decltype(e) is the type of the entity named by e. If there is no such entity, or if e names a set of overloaded functions, the program is ill-formed;

否则,如果 e 是 xvalue,则 decltype(e) 是 T&&,其中 T 是 e 的类型;

otherwise, if e is an xvalue, decltype(e) is T&&, where T is the type of e;

否则,如果 e 是左值,则 decltype(e) 是 T&,其中 T 是 e 的类型;

otherwise, if e is an lvalue, decltype(e) is T&, where T is the type of e;

否则,decltype(e) 是 e 的类型.

otherwise, decltype(e) is the type of e.

decltype 说明符的操作数是未计算的操作数(条款[expr]).

The operand of the decltype specifier is an unevaluated operand (Clause [expr]).

(强调我的)

所以你的 foo(int{ 13 }) 永远不会被评估.

So your foo(int{ 13 }) is never evaluated.

相关文章