不应该选择其参数的触发器编译吗?

Shouldn't decltype Trigger Compilation of its Argument?

本文关键字:编译 触发器 选择 参数 不应该      更新时间:2023-10-16

所以我对它是如何工作的感到困惑。鉴于:

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中的表达式由标准定义为不求值,它们只是为了获取表达式的类型而解析的。