Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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++ 我可以将std::move与不使用';不提供移动构造函数吗?_C++_C++11_Move_Move Semantics - Fatal编程技术网

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没有用户声明的析构函数,并且
  • 移动构造函数不会隐式定义为已删除
所以你的问题的答案是:不,A没有复制到B

不清楚你在其他问题中问了什么。请详细说明

如果没有为类类型(struct、class或union)提供用户定义的移动构造函数,并且以下所有情况均为真:

  • 没有用户声明的副本构造函数
  • 没有用户声明的复制分配运算符
  • 没有用户声明的移动分配运算符
  • 没有用户声明的析构函数
然后编译器将移动构造函数声明为其类的非显式内联公共成员,签名为T::T(T&&)

引自

基本上,是的,只要不定义复制构造函数、复制赋值重载、移动赋值重载或析构函数,就会创建默认的移动构造函数。否则,您必须自己定义行为或使用:

class_name(class_name&&)=默认值;
它将显式声明移动构造函数的默认版本

对象是否有默认的移动构造函数

对你来说是的。对于任何类型的
T
,只有在满足某些条件时才会隐式声明移动构造函数。更多详情请参见

如果是,它如何处理指针和动态分配的数组

默认实现将生成指针的浅层副本。因此,多个对象将指向动态分配的数组。这将导致问题。有关此主题的更多信息,请参阅

如果有指向动态分配数组的指针,则需要:

  • 提供一个显式定义的复制构造函数,该构造函数对动态分配的数组执行正确的操作。这样做的副作用是默认的move构造函数将被隐式删除。和/或
  • 提供一个显式定义的移动构造函数,在该构造函数中可以适当地移动动态分配的数组的所有权