所有std :: tuple构造函数都是必需的吗?

时间:2013-08-18 15:23:58

标签: c++ c++11 rvalue-reference stdtuple

std::tuple包含以下构造函数:

explicit tuple( const Types&... args );

template< class... UTypes >
explicit tuple( UTypes&&... args );

两者都有相同的描述,因为它们使用args中的相应值初始化每个元素。唯一的区别是在第二个参数被转发。

根据我对rvalue引用的理解,我不明白为什么第一个版本是必需的,因为相同的参数可以传递到第二个版本。引用将被转发,没有人会更聪明,特别是因为没有提到移动语义。

任何人都可以解释是什么让两个构造函数成为必要吗?

2 个答案:

答案 0 :(得分:10)

这是一个简化的例子:

template <typename T>
struct foo
{
    foo(const T&);
    template <typename U>
    foo(U&&);
};

第二个构造函数需要某种模板类型推导。这在所有情况下都不起作用,例如使用初始化列表。如果第一个构造函数可用,则以下初始化仅起作用:

auto f = foo<std::vector<int>>{ { 1, 2, 3 } };

答案 1 :(得分:0)

这适用于RValue参考转发,并针对移动构造进行了优化。第一个版本用于左值。请参阅以下链接以更好地解释。

http://thbecker.net/articles/rvalue_references/section_07.html