gpt4 book ai didi

C++ 结构化绑定(bind) : What is the standard order of destruction?

转载 作者:行者123 更新时间:2023-12-05 08:45:30 28 4
gpt4 key购买 nike

是否有任何关于从可以放入结构化绑定(bind)语句的方法返回的对象的销毁顺序的定义? cppreference 似乎没有提到销毁顺序,对 Godbolt 的快速测试揭示了一些与我预期不同的东西。

#include <iostream>
#include <tuple>

struct A{
A()=default;
~A(){ std::cout << "~A()" << std::endl; }
};

struct B{
B()=default;
~B(){ std::cout << "~B()" << std::endl; }

};

struct C{
C()=default;
~C(){ std::cout << "~C()" << std::endl; }
};

auto MakeStuff()
{
auto a = A{};
auto b = B{};
auto c = C{};

return std::make_tuple(std::move(c), std::move(b), std::move(a));
}

int main()
{
auto&& [c, b, a] = MakeStuff();
std::cout << "Results now: " << std::endl;
}

结果:

Program returned: 0
~C()
~B()
~A()
Results now:
~C()
~B()
~A()

我猜想结构化绑定(bind)从右到左构建 [brackets] 中的对象,看看析构函数如何首先调用 c,然后是 b,然后是 一个。这是标准行为,还是我在这里依赖于特定于实现的东西?

谢谢。

最佳答案

结构化绑定(bind)在构建/销毁顺序方面对语言绝对没有任何改变。结构化绑定(bind)是虚构的,是一种语言速记,可以变成 get<I>(unnamed_object)unnamed_object.some_name进入some_name .在这部小说中,unnamed_object是由表达式生成并由 auto[] 捕获的实际对象结构化绑定(bind)声明。

该对象的工作方式与任何其他 C++ 对象完全相同。类中子对象声明的顺序(如果它是一个类)决定构造和销毁的顺序,就像任何其他 C++ 对象一样。

现在,说到 std::tuple ,其子对象声明的顺序是未指定;允许在不同的实现中有所不同。同样,结构化绑定(bind)与此无关。因此销毁的顺序可以是您的特定实现想要的任何顺序。

关于C++ 结构化绑定(bind) : What is the standard order of destruction?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72452428/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com