我知道c ++中的每个表达式都有一个类别(prvalue,xvalue,lvalue ..)和一个类型,根据标准草案,该类型永远都不是引用类型(如果不是prvalue,可能是cv限定的)
5如果表达式最初的类型为“对T的引用”(8.3.2, 8.5.3),在进一步分析之前将类型调整为T。该表达式指定由引用表示的对象或功能, 表达式是左值还是x值,具体取决于 表达。
6如果prvalue最初的类型为“ cv T”,则T为a cv-unqualified非类,非数组类型,表达式的类型 在进行任何进一步分析之前先将其调整为T。
鉴于decltype有其自己的规则集,而自动推导也有不同的规则,那么这种“非引用表达式类型”何时重要?
答案 0 :(得分:1)
这在unevaluated expressions中很重要:
typeid
:
typeid(std::cout << 0) == typeid(std::ostream);
// true
noexcept
:
template<class T> void f() noexcept(noexcept(T{}+T{}))
sizeof
(即使sizeof
has a specific rule也与完整表达式类型的规则不矛盾):
sizeof(std::cout << 0);
// the expression returns an std::ostream&, but its type is std::ostream
等