【发布时间】:2016-12-28 08:33:12
【问题描述】:
是否有规定 std::tuple 的成员被销毁的顺序的规则?
例如,如果Function1 将std::tuple<std::unique_ptr<ClassA>, std::unique_ptr<ClassB>> 返回到Function2,那么我可以确定(当Function2 的范围离开时)第二个成员引用的ClassB 的实例被销毁在第一个成员引用的ClassA 实例之前?
std::tuple< std::unique_ptr< ClassA >, std::unique_ptr< ClassB > > Function1()
{
std::tuple< std::unique_ptr< ClassA >, std::unique_ptr< ClassB > > garbage;
get<0>(garbage).reset( /* ... */ );
get<1>(garbage).reset( /* ... */ );
return garbage;
}
void Function2()
{
auto to_be_destroyed = Function1();
// ... do something else
// to_be_destroyed leaves scope
// Is the instance of ClassB destroyed before the instance of ClassA?
}
【问题讨论】:
-
我猜这主要取决于
std::tuple在您的标准库中是如何实现的。 -
我在规范中找不到指定
std::tuple销毁顺序的任何内容。可能应该以未指定的形式归档。 -
这个问题最近出现在 Antony Polukhin 的 excellet CPPCon 2016 talk 在没有适当语言支持的情况下在 C++14 中实现部分反射。 IIRC 他说他必须做的唯一可怕的事情是重新实现 std::tuple 以强制执行某种初始化顺序。另外,在此上 ping @101010。