error: use of deleted function 'A::A(const A&)'
return tmp;
^~~
Run Code Online (Sandbox Code Playgroud)
为什么仅在其中存在虚拟析构函数时才调用复制构造函数A?如何避免这种情况?
struct B {};
struct A{
std::unique_ptr<B> x;
virtual ~A() = default;
};
A f() {
A tmp;
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
Nat*_*ica 30
virtual ~A() = default;是用户声明的析构函数。因此,A不再具有move构造函数。这意味着return tmp;无法移动,tmp并且由于tmp不可复制,因此会出现编译器错误。
有两种方法可以解决此问题。您可以添加一个移动构造函数,例如
struct A{
std::unique_ptr<B> x;
A() = default; // you have to add this since the move constructor was added
A(A&&) = default; // defaulted move
virtual ~A() = default;
};
Run Code Online (Sandbox Code Playgroud)
或者您可以创建一个具有虚拟析构函数的基类,并从该类继承该基类
struct C {
virtual ~C() = default;
};
struct A : C {
std::unique_ptr<B> x;
};
Run Code Online (Sandbox Code Playgroud)
之所以可行,A是因为不再有用户声明的析构函数(是的,C但是我们只关心A),因此它仍会在中生成move构造函数A。其中的重要部分是C没有删除的move构造函数,只是没有一个句点,因此尝试移动它会导致复制。这意味着
C在A隐式生成的move构造函数中调用了copy构造函数,因为C(std::move(A_obj_to_move_from))只要没有删除的move构造函数,它将进行复制。