4

It was hard to deduce from the proposal.
Will C++17 structured bindings initialize their identifiers from left to right?

Is this guaranteed to print "first", "second", then "third"?

#include <iostream>

struct A{ A(){std::cout << "first\n";  } };
struct B{ B(){std::cout << "second\n"; } };
struct C{ C(){std::cout << "third\n";  } };

struct D{
  A first;
  B second;
  C third;
};

auto f(){
  return D{};
}

int main (){
  auto [a,b,c] = f();
}
4

2 回答 2

3

结构化绑定不复制值;它引用它们。在您的示例中,a不是返回值的第一个成员的副本;它是对它的引用。由于您正在初始化引用而不是值,因此无法通过查看构造函数调用的顺序来检测初始化顺序。

对于具有公共成员的结构,获取这些引用的顺序无关紧要,因为您不能干预该过程。对于实现结构化绑定使用的方法的用户定义结构,情况就不同了。

但是,目前我们无法获得被投票纳入 C++17 CD 的最终标准措辞。所以不可能知道这样的接口函数会以什么顺序被调用,或者它是否指定了一个顺序。

于 2016-06-29T21:07:24.270 回答
1

保证打印“first”,“second”,然后是“third”,但不是由Structured bindings,而是由 的构造函数打印struct D

调用f()会构造 , 的实例struct D,D的构造函数会被调用 , 里面的对象D会按照声明的顺序初始化 , 即A, B,C会按照顺序初始化 , 和 "first", "second",打印“第三”。

但我不确定如何Structured bindings定义初始化顺序。

于 2016-06-27T07:41:08.660 回答