【问题标题】:Exceptions to the order of destruction for temporary objects?临时对象的破坏顺序例外?
【发布时间】:2011-03-21 23:15:07
【问题描述】:

阅读 C++0x 草案的第 1.9/14 条。我找到了:

与完整表达式关联的每个值计算和副作用都在与要评估的下一个完整表达式关联的每个值计算和副作用之前排序。8)

脚注8说

8) 如 12.2 中所述,在评估完整表达式后,会发生零个或多个临时对象的析构函数调用序列,通常与每个构造函数的构造顺序相反临时对象。

“通常”是什么意思?我认为破坏的相反顺序是规则。

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    我假设他们指的是任何绑定到引用的临时对象。临时对象的生命周期延长到引用的生命周期,而其他临时对象仍可能被销毁。

    【讨论】:

    • 我也这么认为,12.2/5:“一个临时文件的销毁,其生命周期没有通过绑定到一个引用来延长,在销毁之前在同一个完整版本中构建的每个临时文件之前进行排序-表达式。”
    【解决方案2】:

    除了 Mark B 的回答(这非常好)还有另一种情况:如果您创建一个通过前向迭代器访问的类型的临时对象,则按照迭代器支持的顺序创建的对象(显然足够)和也以相同的顺序销毁(不是相反的——因为迭代器不支持)。我不记得了,但我似乎记得发生了同样的事情(或者至少是允许的)即使有问题的容器支持反向迭代(所以有问题的代码可以忽略容器/iterator 类型,大概)。

    【讨论】:

    • 我不确定你的意思。你能举个例子吗?
    • @HighCommander4:给定一个临时的std::forward_list 类型(例如)列表中的项目in 从头到尾创建从头到尾销毁(因为这是遍历前向列表的唯一实际方向)。
    • 好的,我明白了。在这种情况下,我不会真正将 那些 对象视为临时对象。它们是由临时列表对象管理的对象,其生命周期特征由列表对象管理它们的方式定义(在这种情况下,通过动态分配和释放它们)。
    猜你喜欢
    • 2010-12-22
    • 2012-12-15
    • 2022-10-14
    • 2020-06-12
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    相关资源
    最近更新 更多