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

DrY*_*Yap 6 c++ rvalue-reference c++11 stdtuple

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

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

template< class... UTypes >
explicit tuple( UTypes&&... args );
Run Code Online (Sandbox Code Playgroud)

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

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

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

nos*_*sid 10

这是一个简化的例子:

template <typename T>
struct foo
{
    foo(const T&);
    template <typename U>
    foo(U&&);
};
Run Code Online (Sandbox Code Playgroud)

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

auto f = foo<std::vector<int>>{ { 1, 2, 3 } };
Run Code Online (Sandbox Code Playgroud)