c ++结构化绑定:破坏的标准顺序是什么?

c++ structured bindings: What is the standard order of destruction?

是否有关于从可以放入结构化绑定语句的方法返回的对象的销毁顺序的定义? 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()

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

谢谢。

结构化绑定在 construction/destruction 的顺序方面对语言绝对没有任何改变。结构化绑定是一种虚构,一种将 get<I>(unnamed_object)unnamed_object.some_name 变成 some_name 的语言 shorthand。在这个虚构中,unnamed_object 是由表达式生成并由 auto[] 结构化绑定声明捕获的 实际对象

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

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