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,这取决于的移动构造函数的行为;我认为所有权将被转移到新对象(然后文件将被新对象关闭)。