【问题标题】:Destructor call in a comma-separated expression以逗号分隔的表达式调用析构函数
【发布时间】:2017-11-02 17:10:08
【问题描述】:

考虑以下示例程序:

#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 链接:http://cpp.sh/3cvm

但是根据 cppreference 关于逗号运算符:

在逗号表达式 E1, E2 中,表达式 E1 被求值,其结果被丢弃,其副作用在表达式 E2 开始求值之前完成

我希望 ~t()cout &lt;&lt; "doing stuff" 之前被调用

这是标准行为吗?如果有,在标准中是在哪里定义的?

【问题讨论】:

    标签: c++ language-lawyer object-lifetime temporary-objects comma-operator


    【解决方案1】:

    “其结果被丢弃”表示子表达式的(此处为t类型)被忽略。

    但是,它的生命周期不受影响:与所有临时变量一样,它在完整表达式(即此处的分号)的末尾被破坏。

    【讨论】:

      【解决方案2】:

      这里的 cppreference 措辞很不幸。

      与任何临时的一样,这个将持续到它出现的 full-expression 的末尾。

      “副作用”是指临时的构造

      【讨论】:

      • 基本上只是标准措辞的复制品(稍作调整)。
      • cppreference 澄清
      • 临时施工是正式的副作用吗?
      • @Quentin:任何可观察到的构造导致的,都是副作用。老实说,我有点惊讶,这同样不适用于破坏。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 2011-05-08
      相关资源
      最近更新 更多