【发布时间】:2011-03-21 23:15:07
【问题描述】:
阅读 C++0x 草案的第 1.9/14 条。我找到了:
与完整表达式关联的每个值计算和副作用都在与要评估的下一个完整表达式关联的每个值计算和副作用之前排序。8)
脚注8说
8) 如 12.2 中所述,在评估完整表达式后,会发生零个或多个临时对象的析构函数调用序列,通常与每个构造函数的构造顺序相反临时对象。
“通常”是什么意思?我认为破坏的相反顺序是规则。
【问题讨论】:
阅读 C++0x 草案的第 1.9/14 条。我找到了:
与完整表达式关联的每个值计算和副作用都在与要评估的下一个完整表达式关联的每个值计算和副作用之前排序。8)
脚注8说
8) 如 12.2 中所述,在评估完整表达式后,会发生零个或多个临时对象的析构函数调用序列,通常与每个构造函数的构造顺序相反临时对象。
“通常”是什么意思?我认为破坏的相反顺序是规则。
【问题讨论】:
我假设他们指的是任何绑定到引用的临时对象。临时对象的生命周期延长到引用的生命周期,而其他临时对象仍可能被销毁。
【讨论】:
除了 Mark B 的回答(这非常好)还有另一种情况:如果您创建一个通过前向迭代器访问的类型的临时对象,则按照迭代器支持的顺序创建的对象(显然足够)和也以相同的顺序销毁(不是相反的——因为迭代器不支持)。我不记得了,但我似乎记得发生了同样的事情(或者至少是允许的)即使有问题的容器将支持反向迭代(所以有问题的代码可以忽略容器/iterator 类型,大概)。
【讨论】:
std::forward_list 类型(例如)列表中的项目in 从头到尾创建和从头到尾销毁(因为这是遍历前向列表的唯一实际方向)。