Jon*_*Mee 16 c++ templates compilation decltype language-lawyer
所以我很困惑这是如何工作的.鉴于:
template <typename T>
int foo(T t) { t.foo(); }
Run Code Online (Sandbox Code Playgroud)
似乎这个调用应该失败:
decltype(foo(int{ 13 })) fail = 42;
cout << fail << endl;
Run Code Online (Sandbox Code Playgroud)
相反它只是打印:
42
它以我可访问的所有编译器的方式工作.这是正确的行为吗?我请求C++标准的引用.
Som*_*ken 17
对于表达式e,由decltype(e)表示的类型定义如下:
如果e是未标记的id-expression,命名从分解声明的identifier-list引入的左值或引用,则decltype(e)是在分解声明的规范([dcl.decomp])中给出的引用类型;
否则,如果e是未加密的id-expression或未加密的类成员访问([expr.ref]),则decltype(e)是e命名的实体的类型.如果没有这样的实体,或者如果e命名了一组重载函数,那么该程序就会形成错误;
否则,如果e是x值,则decltype(e)是T &&,其中T是e的类型;
否则,如果e是左值,则decltype(e)是T&,其中T是e的类型;
否则,decltype(e)是e的类型.
decltype说明符的操作数是未评估的操作数 (Clause [expr]).
(强调我的)
所以你foo(int{ 13 })
永远不会被评估.
表达式中decltype
的表达式由不被评估的标准定义,它们仅被解析以获得表达式的类型.