假定以下代码将类型的对象移动A
到av
(向量)中:
#include <memory>
#include <vector>
struct A
{
~A() {};
std::unique_ptr<int> an_int;
};
int main(int argc, char* argv[])
{
std::vector<A> av;
av.push_back(A());
return 0;
}
这将无法按原样编译。但是,如果我不实现析构函数~A() {}
,它将可以正常工作。编译器提示某些缺失(已删除)copy constructor
,但是我看不到在这里适用的位置(因为我只是在执行移动操作)
unique_ptr
和导致代码无法编译的自定义析构函数之间有什么关系?有一个简单的解决方法吗?
谢谢。
定义自定义析构函数将禁用默认move构造函数和move赋值运算符的生成。使用因而push_back(const A&)
,但A
由于具有unique_ptr
成员,因此也没有副本构造函数。
解决方案是将它们手动定义为default
。但是定义move构造函数会禁用默认的构造函数:
struct A
{
~A() {};
A()=default;
A(A&&)=default;
A& operator=(A&&)=default;
std::unique_ptr<int> an_int;
};
static_assert(std::is_nothrow_move_constructible_v<A>);
static_assert(std::is_nothrow_move_assignable_v<A>);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句