何时使用表达式的类型(而不是类别)? P>我知道C++中的每个表达式都有一个类别(PROVALUE,XValuy,LVal.…),并且根据标准草案的类型,从来没有引用类型(如果不是PR值,可以是CV合格)

何时使用表达式的类型(而不是类别)? P>我知道C++中的每个表达式都有一个类别(PROVALUE,XValuy,LVal.…),并且根据标准草案的类型,从来没有引用类型(如果不是PR值,可以是CV合格),c++,expression,language-lawyer,C++,Expression,Language Lawyer,5如果表达式最初的类型为“引用T”(8.3.2, 8.5.3),在进一步分析之前,将类型调整为T。表达式指定引用所表示的对象或函数, 表达式是左值还是X值,取决于 表情 6如果prvalue最初的类型为“cv T”,其中T为a cv非限定非类、非数组类型、表达式的类型 在进行任何进一步分析之前,调整为T 假设decltype有自己的一套规则,自动推断也有不同的规则,那么这种“非引用表达式类型”什么时候起作用呢?它在以下方面起作用: typeid: typeid(std::cout <<

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

6如果prvalue最初的类型为“cv T”,其中T为a cv非限定非类、非数组类型、表达式的类型 在进行任何进一步分析之前,调整为T

假设decltype有自己的一套规则,自动推断也有不同的规则,那么这种“非引用表达式类型”什么时候起作用呢?

它在以下方面起作用:

typeid

typeid(std::cout << 0) == typeid(std::ostream);
// true
sizeof
(即使与完整表达式类型的规则不冲突):


sizeof(std::cout-sizeof)可能不是最好的例子…@StoryTeller in
sizeof(std::cout)你到底是什么意思?如果调整规则不到位,语言的其他哪些部分会被破坏?我也不明白。这只是标准如何表达引用的含义。
template<class T> void f() noexcept(noexcept(T{}+T{}))
sizeof(std::cout << 0);
// the expression returns an std::ostream&, but its type is std::ostream