7

std::tuple除其他外,包含以下构造函数:

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

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

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

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

任何人都可以解释是什么使这两个构造函数都是必要的吗?

4

2 回答 2

11

这是一个简化的示例:

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

第二个构造函数需要某种模板类型推导。这并不适用于所有情况,例如初始化列表。仅当第一个构造函数可用时,以下初始化才有效:

auto f = foo<std::vector<int>>{ { 1, 2, 3 } };
于 2013-08-18T15:34:19.303 回答
0

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

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

于 2013-08-18T15:35:05.617 回答