以逗号分隔的表达式调用析构函数
Destructor call in a comma-separated expression
考虑以下示例程序:
#include <iostream>
using namespace std;
struct t
{
~t() {cout << "destroyed\n"; }
};
int main()
{
cout << "test\n";
t(), cout << "doing stuff\n";
cout << "end\n";
}
我使用 GCC 4.9.2 得到的输出是:
test
doing stuff
destroyed
end
cpp.sh link: http://cpp.sh/3cvm
但是根据关于逗号运算符的 cppreference:
In a comma expression E1, E2, the expression E1 is evaluated, its result is discarded, and its side effects are completed before evaluation of the expression E2 begins
我希望 ~t()
在 cout << "doing stuff"
之前被调用
这是标准行为吗?如果是这样,它在标准中的什么地方定义?
"Its result is discarded" 表示忽略子表达式的 value(这里的类型 t
)。
然而,它的生命周期不受影响:与所有临时对象一样,它在完整表达式的末尾(即此处的分号)被破坏。
这里的 cppreference 措辞很不幸。
与任何临时文件一样,这个临时文件将持续到它出现的完整表达式结束。
"side effects"讲的是临时建设
考虑以下示例程序:
#include <iostream>
using namespace std;
struct t
{
~t() {cout << "destroyed\n"; }
};
int main()
{
cout << "test\n";
t(), cout << "doing stuff\n";
cout << "end\n";
}
我使用 GCC 4.9.2 得到的输出是:
test
doing stuff
destroyed
end
cpp.sh link: http://cpp.sh/3cvm
但是根据关于逗号运算符的 cppreference:
In a comma expression E1, E2, the expression E1 is evaluated, its result is discarded, and its side effects are completed before evaluation of the expression E2 begins
我希望 ~t()
在 cout << "doing stuff"
这是标准行为吗?如果是这样,它在标准中的什么地方定义?
"Its result is discarded" 表示忽略子表达式的 value(这里的类型 t
)。
然而,它的生命周期不受影响:与所有临时对象一样,它在完整表达式的末尾(即此处的分号)被破坏。
这里的 cppreference 措辞很不幸。
与任何临时文件一样,这个临时文件将持续到它出现的完整表达式结束。
"side effects"讲的是临时建设