为什么`std :: pair`把`std :: tuple`作为ctor参数类型而不是`const std :: tuple&`?

时间:2014-07-10 01:03:10

标签: c++ c++11 optimization constructor parameter-passing

C ++ 11标准定义了std::pair的构造函数,如下所示:

template<class... Args1, class... Args2>
pair(std::piecewise_construct_t, std::tuple<Args1...> first_args,
     std::tuple<Args2...> second_args);

为什么std::pairstd::tuple作为ctor参数类型而不是const std::tuple&

复制first_args和second_args会怎么样?

1 个答案:

答案 0 :(得分:6)

目的是让那些元组成为引用的元组,由std::forward_as_tuple创建:

Foo x;
Bar y(1, 2, true);

std::pair<A, B> p(std::piecewise_construct,
                  std::forward_as_tuple(10, x, make()),
                  std::forward_as_tuple(std::move(y), false, get(), 'a'));

这通过A(10, x, make())等构建对元素。

实际的元组类型是std::tuple<int &&, Foo &, Z &&>等,它们很轻。