以逗号分隔的表达式调用析构函数

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"讲的是临时建设