何时使用表达式的类型(而非类别)?

时间:2018-08-21 09:32:32

标签: c++ expression language-lawyer

我知道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有其自己的规则集,而自动推导也有不同的规则,那么这种“非引用表达式类型”何时重要?

1 个答案:

答案 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