是否有规定 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?
}
最佳答案
我将提供一个我学到的人生教训,而不是直接回答你的问题:
If you can formulate, for multiple alternatives, a reasonable argument for why that alternative should be the one mandated by the standard - then you should not assume any of them is mandated (even if one of them happens to be).
在元组的上下文中 - 请善待维护您的代码的人,不要让元组元素的销毁顺序可能会破坏其他元素的销毁。那只是邪恶的......想象一下需要调试这个东西的倒霉程序员。事实上,那个可怜的灵魂可能会在几年后成为你自己,那时你已经忘记了你过去的聪明伎俩。
如果你绝对必须依赖销毁顺序,也许你应该使用一个适当的类,将元组的元素作为它的数据成员(你可以为它编写一个析构函数,明确需要以什么顺序发生什么),或其他有助于更明确地控制销毁的安排。
关于C++ std::tuple 破坏顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39068546/