C++ "declaration and initialization" 语句是表达式吗?

Is C++ "declaration and initialization" statement, an expression?

语言标准说:

[ Note: Clause 5 defines the syntax, order of evaluation, and meaning of expressions.58 An expression is a sequence of operators and operands that specifies a computation. An expression can result in a value and can cause side effects. — end note ]

例如我的代码如下:

int i=1;
A obj;

所以,上面的两个语句都算作"expression"?

Whosebug 上有人说 "int i=1;" 不是表达式。这对我来说很奇怪。

(1) 初始化是一种 "computation",对吧?所以它应该被认为是 "expression"?

(2) 一个对象; //调用一个构造函数。 ctor 是一种计算,因此应将其视为 "expression"?

标准中的非规范性注释旨在激发表达式的概念,但不是实际定义。 expression 的定义在第 5 节的其余部分给出的语言语法中给出。表达式由某些终端构建,例如文字,变量名称和函数名称,使用算术运算符和关系运算符等运算符组合。

声明和表达式是截然不同的句法实体,因此在 C++ 程序中找到的声明绝不是表达式,反之亦然。一眼就能看出区别: 如果它声明了什么,那就是声明。

1;          // expression statement
int i = 1;  // declaration statement that declares `i`
A(i, 42);   // expression statement that creates an A object
A a(i);     // declaration statement that declares an A object (named a)

声明可以计算表达式,但声明不是表达式。您正确地指出 class 类型的对象的声明可能会导致构造函数调用。它在语法上仍然是声明而不是表达式。

然而,在另一种意义上,声明 表达式。也就是说,有关表达式内求值顺序的规则也适用于声明。例如,有一个规则,int 的后缀增量的副作用发生在完整表达式结束之前的某个点。

f(i++) + g();  // i may be incremented before or after g() is called...
h();           // but definitely before h() is called.

出于此类规则的目的,单个变量的声明和初始化也被视为完整表达式。对于 class 类型的变量,构造函数调用是该表达式的一部分。

int i = 1;                      // this declaration evaluates a full-expression
                                // whose effect is to initialize `i` to 1
int j = f(i++) + g(), k = h();  // two separate full-expressions;
                                // i is incremented before h() is called

阅读标准时,您需要考虑上下文才能弄清楚 "expression" 的含义。