C++ 中的“表达式类型”是什么?

Yue*_*hou 3 c++ expression language-lawyer

我知道什么是“表达类别”,但我对“表达类型”感到困惑。

根据www.cppreference.com

表达式求值可能会产生结果。

那么,结果的类型就是“表达式的类型”吗?

但是,根据www.cppreference.com :,它说:

每个 C++ 表达式都有两个独立的属性:类型和值类别。

那么,“类型”是指表达式的类型,还是表达式结果的类型?

我想这可能需要一些编译原理的知识(我对此一无所知),到底是先判断表达式的类型,然后根据它来判断表达式结果的类型?或者表达式结果的类型就是表达式的类型?

请从编译原理的角度给出一个通俗易懂的解释。

eer*_*ika 5

\n
\n

每个 C++ 表达式都有两个独立的属性:类型和值类别。

\n
\n

那么,“type”是指表达式的类型吗

\n
\n

是的。“类型”确实指的是那里的表达式的类型。

\n
\n

那么,结果的类型就是“表达式的类型”吗?

\n
\n

不必要。表达式和表达式的结果是不同的东西。在某些情况下,表达式及其结果确实具有相同的类型,而在其他情况下,这些类型不同。此外,有些表达式没有任何结果。

\n
\n

表达式的结果在标准中定义如下:

\n
\n

[基本.lval]

\n

左值的结果是表达式表示的实体。\n纯右值的结果是表达式存储到其上下文中的值;类型为 cv void 的纯右值没有结果。\n结果为值 V 的纯右值有时被称为具有或命名为值 V。\n纯右值的结果对象是由该纯右值初始化的对象;用于计算内置运算符的操作数值的非丢弃纯右值或类型为 cv void 的纯右值没有结果对象。

\n
\n
\n

表达式的类型是为每种表达式定义的。例如:

\n
\n

[expr.unary.op]

\n

一元 * 运算符执行间接寻址。\n其操作数应是类型为 \xe2\x80\x9c 的纯右值,指向 T\xe2\x80\x9d,其中 T 是对象或函数类型。\n该运算符生成类型 T 的左值,表示操作数指向的对象或函数。

\n
\n

高亮部分表示表达式的类别为左值,表达式的类型为T

\n

例如:

\n
int  i = 0;\nint* p = &i;\nint  j = *p;\n
Run Code Online (Sandbox Code Playgroud)\n

表达式的类型*p按照int引用的规则。它是一个左值,结果是对象 - 也由变量命名i- 其类型也是int

\n

此外,本节[expr.type]指定了可以调整任何类型表达式的类型的规则。

\n