Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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++_C++11_Move Semantics_Move Constructor_Movable - Fatal编程技术网

C++ 移动类的构造函数

C++ 移动类的构造函数,c++,c++11,move-semantics,move-constructor,movable,C++,C++11,Move Semantics,Move Constructor,Movable,我写了两个类,但在将它们放入向量时遇到了一个问题: #include <vector> #include <iostream> #include <fstream> class A { public: std::ofstream filestream; int aa1; int aa2; int aa3; int aa4; int aa5; int aa6; int aa7; int a

我写了两个类,但在将它们放入向量时遇到了一个问题:

#include <vector>
#include <iostream>
#include <fstream>

class A
{
public:
    std::ofstream filestream;
    int aa1;
    int aa2;
    int aa3;
    int aa4;
    int aa5;
    int aa6;
    int aa7;
    int aa8;
    int aa9;
    int aa10;

    A() {}
    ~A() {}
};

class B
{
    A aaa;
public:
    int b1;
    int b2;
    int b3;
    int b4;
    int b5;
    int b6;
    int b7;
    int b8;
    int b9;
    int b10;

    B() {}
    ~B() {}
};

int main()
{
    std::vector<B> vec;
    vec.emplace_back();
    return 0;
}
为什么它不隐式移动

g++ -v
 ...
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.5) 
如果提供了用户定义的析构函数,则移动构造函数将不可用:

  • 没有用户声明的副本构造函数
  • 没有用户声明的副本分配运算符
  • 没有用户声明的移动分配运算符
  • 没有用户声明的析构函数
您可以删除
A
B
的析构函数声明,让编译器为您生成移动构造函数,也可以使用
default
显式定义它们。对于这两种情况,move构造函数都会对对象的基成员和非静态成员执行全成员移动。e、 g

class A
{
public:
    ...
    A(A&&) = default;
};

class B
{
public:
    ...
    B(B&&) = default;
};

为什么它不隐式移动

g++ -v
 ...
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.5) 
如果提供了用户定义的析构函数,则移动构造函数将不可用:

  • 没有用户声明的副本构造函数
  • 没有用户声明的副本分配运算符
  • 没有用户声明的移动分配运算符
  • 没有用户声明的析构函数
您可以删除
A
B
的析构函数声明,让编译器为您生成移动构造函数,也可以使用
default
显式定义它们。对于这两种情况,move构造函数都会对对象的基成员和非静态成员执行全成员移动。e、 g

class A
{
public:
    ...
    A(A&&) = default;
};

class B
{
public:
    ...
    B(B&&) = default;
};

加上宋源尧的回答,这就完美地解释了隐式构造函数的一切。

加上宋源尧的回答,这就完美地解释了隐式构造函数的一切。

只要加上我需要这个构造函数。请不要要求我删除它。只需添加我需要的构造函数。请不要要求我删除它。我可以同时拥有析构函数和默认构造函数吗?@ar2015是的。查看我链接的实时示例。假设我关闭析构函数中的文件。移动中会发生什么?文件是否关闭?@ar2015,这取决于的移动构造函数的行为;我想所有权将转移到新对象(然后新对象将关闭文件)。我可以同时拥有析构函数和默认构造函数吗?@ar2015是的。查看我链接的实时示例。假设我关闭析构函数中的文件。移动中会发生什么?文件是否关闭?@ar2015,这取决于的移动构造函数的行为;我认为所有权将被转移到新对象(然后文件将被新对象关闭)。