在模板类中使用 r 和 l 值构造函数时出错
Error when using r and l value constructors in a template 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 时提供的优化)?
我认为这是因为T&&是一个普遍的参考......
不對。 在这种情况下,T&&
不是通用(转发)引用。 T&&
正是对 T
的右值引用。必须推断出通用/转发参考。
。由于引用折叠规则,第二个构造函数也会转换为与第一个构造函数具有相同的签名。
这是正确的。我们的两个构造函数采用:
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&& );
};
对于您的示例,这仍将创建一个具有两个构造函数的类:一个采用const A&
,另一个采用A&&
。
相关文章:
- 使用dynamic_cast和构造函数时出错
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 使用根/C++时出错:没有匹配的构造函数来初始化'TTree'
- 使用类的构造函数时出错
- 在 c++ 的构造函数中分配对象向量时出错
- 调用 cv::stereoBM 构造函数时出错
- 尝试从 C++ 中的构造函数从类继承时出错
- 尝试使用构造函数创建对象时出错
- 类中私有结构的构造函数出错
- 在构造函数中分配数组时出错
- 不可复制的对象、映射和shared_ptr:复制构造函数中出错
- 我的类默认构造函数出错
- 在另一个模板类构造函数中使用typdef模板时出错
- C++从构造函数返回值时出错
- 尝试在<int>构造函数中使用 vector 启动类时出错
- 在c++中初始化构造函数中的静态成员变量时出错
- 复制构造函数出错
- 结构初始化中的隐式复制构造函数出错
- 编译器错误消息错误:令牌之前的预期')' '*'。我的构造函数出错
- 调用构造函数出错