在模板中使用 r 和 l 值构造函数时出错 class
Error when using r and l value constructors in a template class
我有一个这样的 class 模板:
template <typename T>
class MyClass
{
public:
MyClass(const T & val); // First
MyClass(T&& val); // Second
};
基本上我希望 MyClass 可以从 T
构造,无论它是右值还是左值。现在当我有类似
的东西时
const A& foo = ...;
MyClass<const A&> x(foo);
我收到 MyClass(const A & val)
的重定义错误。
我认为这是因为 T&& 是通用引用,并且由于引用折叠规则,第二个构造函数也被转换为具有与第一个相同的签名。
首先我对错误场景的理解是否正确?其次我怎样才能解决这个问题(我希望能够在构造 MyClass 时使用移动语义提供的优化)?
I presume this is because T&& is a universal reference ...
不正确。在这种情况下,T&&
不是通用(转发)引用。 T&&
恰好是对 T
的右值引用。 Universal/forwarding 必须推导引用。
... and due to reference collapsing rules, the second constructor also gets converted to having the same signature as the first.
这个是正确的。我们的两个构造函数采用:
T const& ==> A const& const& ==> A const&
T&& ==> A const& && ==> A const&
因此重定义错误。
根据您想做什么,一个简单的解决方案可能是 std::decay
T
:
template <typename T>
class MyClass
{
using DecT = typename std::decay<T>::type;
public:
MyClass(const DecT& );
MyClass(DecT&& );
};
对于您的示例,这仍将创建一个具有两个构造函数的 class:一个采用 const A&
,另一个采用 A&&
.
我有一个这样的 class 模板:
template <typename T>
class MyClass
{
public:
MyClass(const T & val); // First
MyClass(T&& val); // Second
};
基本上我希望 MyClass 可以从 T
构造,无论它是右值还是左值。现在当我有类似
const A& foo = ...;
MyClass<const A&> x(foo);
我收到 MyClass(const A & val)
的重定义错误。
我认为这是因为 T&& 是通用引用,并且由于引用折叠规则,第二个构造函数也被转换为具有与第一个相同的签名。
首先我对错误场景的理解是否正确?其次我怎样才能解决这个问题(我希望能够在构造 MyClass 时使用移动语义提供的优化)?
I presume this is because T&& is a universal reference ...
不正确。在这种情况下,T&&
不是通用(转发)引用。 T&&
恰好是对 T
的右值引用。 Universal/forwarding 必须推导引用。
... and due to reference collapsing rules, the second constructor also gets converted to having the same signature as the first.
这个是正确的。我们的两个构造函数采用:
T const& ==> A const& const& ==> A const&
T&& ==> A const& && ==> A const&
因此重定义错误。
根据您想做什么,一个简单的解决方案可能是 std::decay
T
:
template <typename T>
class MyClass
{
using DecT = typename std::decay<T>::type;
public:
MyClass(const DecT& );
MyClass(DecT&& );
};
对于您的示例,这仍将创建一个具有两个构造函数的 class:一个采用 const A&
,另一个采用 A&&
.