【发布时间】:2015-08-24 15:43:16
【问题描述】:
我遇到了一个非常有趣的情况,因为我正在编写的代码可以编译,尽管我很惊讶它会编译,所以我想请你接受。
情况是这样的。我有一个删除了移动和复制构造函数的类,它具有用户定义的赋值运算符:
struct A {
A() { }
A(const A&) = delete;
A(A&& ) = delete;
A& operator=(const A& ) { return *this; }
A& operator=(A&& ) { return *this; }
};
我还有另一个班级,A 是唯一的成员。在这个类中,我定义了复制构造函数,但我将移动构造函数保持为默认值,并通过调用交换函数定义了赋值运算符:
class B{
public:
A a;
B()
: a{}
{ }
B(const B&)
: a{}
{ }
B(B&& other) = default;
};
int main() {
B b1;
B b2(std::move(b1)); // compiles??
}
考虑到它不能简单地调用移动或复制构造函数A,为什么默认移动构造函数可以工作?我正在使用 gcc 4.8.4。
【问题讨论】:
标签: c++ c++11 move-semantics