2013-08-18 52 views
6

std::tuple包含,除其他外,以下的构造:所有的std :: tuple构造函数都是必需的吗?

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

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

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

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

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

+3

第二个版本是SFINAE-d出过载如果不是全部设置的'UTypes'是隐式转换为对应的'Types' – jrok

回答

10

下面是一个简单的例子:

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

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

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

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

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

+4

第二个版本可以用于rvalue引用以及用于左值的引用。 – nosid

+0

同意,但编译器将在编译时作出函数签名的最佳选择,在这种情况下,它们提供了2个签名。我同意你的回答,以及它有助于模板扣除,并因此需要。 – bjackfly

相关问题