编译器支持最低版本要求:
- GCC: 7
- MSVC: 19.1
- Clang: 4
提案: P0217R3
C++11加入了std::get
,可以对std::tuple
,std::pair
,std::array
进行操作,获取指定序号的元素,例如:
auto p = std::make_pair(1, 2);
auto t = std::make_tupe(1, 2, 3);
std::array<int> a = {1, 2, 3, 4};
auto p0 = std::get<0>(p);
auto t1 = std::get<1>(t);
auto a2 = std::get<2>(a);
同时也加入了std::tie
来获取元素,并以这些元素的值创建一个新的std::tuple
,例如:
int t0, t1, t2;
std::tie(t0, t1, t2) = t;
以上std::tie
会创建一个新的std::tuple
对象,该对象保持了对t0
,t1
,t2
的左值引用,所以当再将t
赋值给此对象时,就把t
中对应位置的元素的值赋值给t0
,t1
,t2
了。
C++17中引入了反结构化初始化,允许写出这样的代码:
auto [ x, y, z ] = expr;
其中expr
的类型,是类tuple
的对象,它的元素可以被绑定到x
,y
和z
上(就是该语句声明的那几个变量)。类tuple
的对象可以是std::tuple
,std::pair
,std::array
或聚合类型的结构体以及普通数组,例如:
using Coordinate = std::pair<int, int>;
Coordinate origin() {
return Coordinate{0, 0};
}
const auto [ x, y ] = origin();
int a[3] = {1,2,3};
auto [a1, a2, a3] = a;
这种写法大大简化了代码,不但能达到C++11中引入的std::get
和std::tie
的效果,还增加了对聚合类型的结构体以及普通数组的支持。