不那么新的C++标准学习笔记 logo 不那么新的C++标准学习笔记

编译器支持最低版本要求:

  • GCC: 7
  • MSVC: 19.1
  • Clang: 4

提案: P0217R3

C++11加入了std::get,可以对std::tuplestd::pairstd::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对象,该对象保持了对t0t1t2的左值引用,所以当再将t赋值给此对象时,就把t中对应位置的元素的值赋值给t0t1t2了。

C++17中引入了反结构化初始化,允许写出这样的代码:

auto [ x, y, z ] = expr;

其中expr的类型,是类tuple的对象,它的元素可以被绑定到xyz上(就是该语句声明的那几个变量)。类tuple的对象可以是std::tuplestd::pairstd::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::getstd::tie的效果,还增加了对聚合类型的结构体以及普通数组的支持。

感觉不错,小额赞助一下!

Hosted by Github Pages, 本站由 @missdeer 创建,由 Jekyll 于 2019-05-07 生成,感谢 CloudCannon 制作的theme: Edition ,感谢 Let's Encrypt 提供免费的SSL证书服务。本站点采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。© 2019