请考虑以下示例程序:
#include <iostream>
using namespace std;
struct t
{
~t() {cout << "destroyedn"; }
};
int main()
{
cout << "testn";
t(), cout << "doing stuffn";
cout << "endn";
}
我在 GCC 4.9.2 中获得的输出是:
test
doing stuff
destroyed
end
cpp.sh 链接:http://cpp.sh/3cvm
但是,根据 cpp 对逗号运算符的偏好:
在逗号表达式 E1、E2 中,计算表达式 E1,丢弃其结果,并在表达式 E2 开始计算之前完成其副作用
我希望~t()
在cout << "doing stuff"
之前被召唤
这是标准行为吗?如果是这样,标准中在哪里定义?
"它的结果被丢弃"意味着子表达式的值(这里类型t
)被忽略。
然而,它的生存期不受影响:与任何临时变量一样,它在全表达式的末尾(即这里的分号)被破坏。
这里的cpp偏好措辞是不幸的。
与任何临时一样,这将持续到它出现的完整表达式结束。
通过"副作用",它谈论的是临时的构建。