C++ 隐式生成移动构造函数
是否有任何方法可以隐式生成仅移动类的移动构造函数?考虑这样一个类:C++ 隐式生成移动构造函数,c++,visual-c++,c++11,visual-studio-2012,move-semantics,C++,Visual C++,C++11,Visual Studio 2012,Move Semantics,是否有任何方法可以隐式生成仅移动类的移动构造函数?考虑这样一个类: class moveable_only { unique_ptr<int> p_; }; moveable_only m; foo(std::move(m)); 这不会编译,因为隐式声明的复制构造函数无法复制p_3;。12.8/7 如果类定义没有显式声明副本构造函数,则隐式声明副本构造函数。如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数定义为已删除;否则,定义为默认的8.4 现在考虑一
class moveable_only
{
unique_ptr<int> p_;
};
moveable_only m;
foo(std::move(m));
这不会编译,因为隐式声明的复制构造函数无法复制p_3;。12.8/7
如果类定义没有显式声明副本构造函数,则隐式声明副本构造函数。如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数定义为已删除;否则,定义为默认的8.4
现在考虑一下:
class moveable_only
{
unique_ptr<int> p_;
moveable_only(const moveable_only&);
moveable_only& operator = (const moveable_only&);
};
moveable_only m;
foo(std::move(m));
由于12.8/9的原因,这也不能编译
如果类X的定义没有显式声明移动构造函数,则当且仅当
-X没有用户声明的复制构造函数
-X没有用户声明的复制分配运算符
-X没有用户声明的移动分配运算符
-X没有用户声明的析构函数,并且
-移动构造函数不会隐式定义为已删除
这不会编译,因为隐式声明的复制构造函数无法复制p_3;。12.8/7
不需要复制构造函数。这不会编译,因为编译器似乎不会自动生成移动构造函数,而它应该自动生成移动构造函数
除了自己实现或更新编译器之外,没有其他方法可以解决这个问题
这不会编译,因为隐式声明的复制构造函数无法复制p_3;。12.8/7
不需要复制构造函数。这不会编译,因为编译器似乎不会自动生成移动构造函数,而它应该自动生成移动构造函数
除了自己实现或更新编译器之外,没有其他方法可以解决此问题。好的,如果我的编译器还不支持此功能,基本上,我注定要一直完整地编写移动构造函数和移动赋值操作符?@cooky我以一种可能的方式进行了编辑,以减少代码重复的数量。我真的不明白你用我想要的行为编写一个可复制的唯一ptr意味着什么,我不希望它是可复制的^^哦,等等。那么,我似乎误解了你问题中的某些内容。我更新了答案。@cooky451:VS11只是针对标准的旧草案;它不是一个bug,而是一个尚未实现的特性。有关详细信息,请参阅。好吧,如果我的编译器还不支持此功能,我基本上注定要始终完整地编写移动构造函数和移动赋值运算符?@cooky我以一种可能的方式进行了编辑,以减少代码重复量。我真的不明白你用我想要的行为编写一个可复制的唯一\u ptr是什么意思,我不想让它被复制^^哦,等等。那么,我似乎误解了你问题中的某些内容。我更新了答案。@cooky451:VS11只是针对标准的旧草案;它不是一个bug,而是一个尚未实现的特性。有关详细信息,请参阅。