std::tuple
包含以下构造函数:
explicit tuple( const Types&... args );
template< class... UTypes >
explicit tuple( UTypes&&... args );
两者都有相同的描述,因为它们使用args
中的相应值初始化每个元素。唯一的区别是在第二个参数被转发。
根据我对rvalue引用的理解,我不明白为什么第一个版本是必需的,因为相同的参数可以传递到第二个版本。引用将被转发,没有人会更聪明,特别是因为没有提到移动语义。
任何人都可以解释是什么让两个构造函数成为必要吗?
答案 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