C++ 我可以将std::move与不使用';不提供移动构造函数吗?
我有一门课是这样的:C++ 我可以将std::move与不使用';不提供移动构造函数吗?,c++,c++11,move,move-semantics,C++,C++11,Move,Move Semantics,我有一门课是这样的: class myClass { int x[1000]; public: int &getx(int i) { return x[i]; } } 请注意,我没有在这里提供移动构造 如果我使用以下代码: myClass A; auto B=std::move(a); A是否移动到B,或者由于我没有提供移动构造函数,A是否复制到B 对象是否有默认的移动构造函数?如果是,它如何处理指针和动态分配的数组?移动构造函数是
class myClass
{
int x[1000];
public:
int &getx(int i)
{
return x[i];
}
}
请注意,我没有在这里提供移动构造
如果我使用以下代码:
myClass A;
auto B=std::move(a);
A是否移动到B,或者由于我没有提供移动构造函数,A是否复制到B
对象是否有默认的移动构造函数?如果是,它如何处理指针和动态分配的数组?移动构造函数是为类生成的,因为您没有定义任何避免生成它的方法(作为用户定义的析构函数或复制构造函数)
自动生成的移动构造函数将移动每个成员。对于
int[1000]
而言,它相当于复制。您的问题类似于。请注意,std::move只是一个强制转换。您的值a将被转换为右值引用,但在您的情况下,原始对象不会被掠夺或窃取
要正确使用API或习惯用法,您必须将其用于正确的用途。移动对于类对象最有意义,例如,在类对象中,大部分对象数据是在堆上分配的。这样的对象很容易被盗,“移动”可以使被盗对象处于定义良好的状态。规范示例可以是,例如,堆上有字符串数据的某种类型的字符串类
在你的情况下,你希望发生什么?假设a是某个函数中的局部变量,即假设a在堆栈上。假设b是一个全局或文件范围或匿名命名空间变量,即不在堆栈上。从a移动到b时,您希望发生什么
对于字符串来说,偷窃是有意义的。对于您的情况,偷窃是毫无意义的。虽然您没有提供显式移动构造函数,但编译器为您提供了隐式移动构造函数 如果类X的定义没有显式声明移动构造函数,则当且仅当
- X没有用户声明的复制构造函数,并且
- X没有用户声明的复制分配运算符
- X没有用户声明的移动分配运算符
- X没有用户声明的析构函数,并且
- 移动构造函数不会隐式定义为已删除
- 没有用户声明的副本构造函数
- 没有用户声明的复制分配运算符
- 没有用户声明的移动分配运算符
- 没有用户声明的析构函数
class_name(class_name&&)=默认值;
它将显式声明移动构造函数的默认版本
对象是否有默认的移动构造函数
对你来说是的。对于任何类型的T
,只有在满足某些条件时才会隐式声明移动构造函数。更多详情请参见
如果是,它如何处理指针和动态分配的数组
默认实现将生成指针的浅层副本。因此,多个对象将指向动态分配的数组。这将导致问题。有关此主题的更多信息,请参阅
如果有指向动态分配数组的指针,则需要: