【发布时间】:2020-10-26 02:52:38
【问题描述】:
我发现两个相似的语句之间有不同的执行顺序(唯一的区别是下面的语句多了一个;)。析构函数的顺序不同。 C++ 是否对此有相应的规范,或者它只是一种未指定的行为?
环境:GCC10
#include <iostream>
template <int num>
struct S {
S() {std::cout << "S(" << num << ")\n"; }
~S() {std::cout << "~S(" << num << ")\n"; }
};
int main() {
({S<1>(), S<2>();});
std::cout << "-----------------------------------\n";
({S<3>(), S<4>();;});
}
输出:
S(1)
S(2)
~S(1)
~S(2)
-----------------------------------
S(3)
S(4)
~S(4)
~S(3)
【问题讨论】:
-
这不是标准的 C++。这是一个 GCC 扩展,称为 statement expression
-
如果 C++ 是指 C++ 标准,那么它没有为这个程序指定任何特定的析构函数顺序,原因很简单,这个程序格式错误。
-
@IgorTandetnik 你是对的。所以我添加了一个没有语句表达式的新程序。
-
作为完整表达式求值的一部分而创建的临时对象在完整表达式的末尾以与构造相反的顺序被销毁。
标签: c++ gcc gcc-statement-expression