不应该选择其参数的触发器编译吗?
Shouldn't decltype Trigger Compilation of its Argument?
所以我对它是如何工作的感到困惑。鉴于:
template <typename T>
int foo(T t) { t.foo(); }
似乎此调用应该失败:
decltype(foo(int{ 13 })) fail = 42;
cout << fail << endl;
相反,它只是打印:
42
它在我有权访问的所有编译器上都是这样工作的。这是正确的行为吗?我要求引用C++标准。
in [dcl.spec] :
对于表达式 e,由 decltype(e) 表示的类型定义为遵循:
如果 e 是一个不带括号的 ID 表达式,用于命名从分解的标识符列表中引入的左值或引用声明,decltype(e) 是引用的类型,如分解声明的规范([dcl.decomp]);
否则,如果 e 是无括号的 ID 表达式或无括号的类成员访问 ([expr.ref]),则 decltype(e) 为由 E 命名的实体的类型。如果没有这样的实体,或者如果命名一组重载函数,程序格式不正确;
否则,如果 e 是 x值,decltype(e) 是 T&&,其中 T 是 e 的类型;
否则,如果 e 是左值,则 decltype(e) 是 T&,其中 T 是 e 的类型;
否则,decltype(e) 是 e 的类型。
decltype 说明符的操作数是未计算的操作数(条款 [排除])。
(强调我的)
因此,您的foo(int{ 13 })
永远不会被评估。
> decltype
中的表达式由标准定义为不求值,它们只是为了获取表达式的类型而解析的。