首页 > 解决方案 > 何时使用表达式的类型(不是类别)?

问题描述

我知道c ++中的每个表达式都有一个类别(prvalue,xvalue,lvalue..)和一个根据标准草案永远不是引用类型的类型(如果不是prvalue,可能是cv限定的)

5 如果表达式最初具有类型“对 T 的引用”(8.3.2、8.5.3),则在进一步分析之前将类型调整为 T。表达式指定引用表示的对象或函数,表达式是左值或 x 值,具体取决于表达式。

6 如果纯右值最初具有类型“cv T”,其中 T 是无 cv 限定的非类、非数组类型,则表达式的类型在任何进一步分析之前调整为 T。

鉴于 decltype 有自己的一套规则,而自动推导也有不同的规则,那么这种“非引用表达式类型”何时重要?

标签: c++expressionlanguage-lawyer

解决方案


它在未评估的表达式中很重要:

typeid

typeid(std::cout << 0) == typeid(std::ostream);
// true

noexcept

template<class T> void f() noexcept(noexcept(T{}+T{}))

sizeof(即使sizeof有一个特定的规则,与完整表达式类型的规则不矛盾):

sizeof(std::cout << 0);
// the expression returns an std::ostream&, but its type is std::ostream

等等


推荐阅读