Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 隐式生成移动构造函数_C++_Visual C++_C++11_Visual Studio 2012_Move Semantics - Fatal编程技术网

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,而是一个尚未实现的特性。有关详细信息,请参阅。