C++ std::tuple 破坏顺序

标签 c++ c++11 std stdtuple

是否有规定 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/

相关文章:

c++ - friend 声明声明了一个非模板函数

c++ - 如何将单个对象转换为boost::any_range?

c++ - 在一个变量中保存两种不同的返回类型

java - 语义 - 将已实现的接口(interface)传递给方法

c++ - 使用 boost::wave 时的运行时错误消息

c++ - C/C++ 中 isspace 的声明不一致?

c++ - const char * 到 std::basic_iostream

c++ - 写入文件,读取时分隔值

C++:存储用户输入

c++ - 无法复制文件,然后在 C++ 中执行它