给定基类A和派生类B,A删除了移动构造函数:
class A {
public:
A() {}
A(const A&) = default;
A(A&&) = delete;
};
class B : public A
{
};
在这种情况下,由于删除了移动构造函数,以下函数不会编译:
A f() {
A a;
return a;
}
但是B的类似函数不报告任何错误:
B g() {
B b;
return b;
}
这是否意味着B中的移动构造函数没有被删除?我想知道标准中的规则是什么?
2条答案
按热度按时间1cklez4t1#
B
中的移动构造函数被删除,但不参与重载解析。根据cppreference:如果以下任一条件为真,则类T的隐式声明或默认移动构造函数被定义为 deleted:
重载解析会忽略删除的默认移动构造函数(否则会阻止从右值进行复制初始化)。
第二点适用于:
B
具有直接基类A
,其具有删除的移动构造函数,因此B
的隐式声明的移动构造函数被定义为删除。但是,当return语句计算使用
B
的哪个构造函数时,不考虑删除的移动构造函数,而考虑有效的复制构造函数。hmae6n7t2#
B
的移动构造函数被删除,as already answered by @Nathan Pierson。可以从
g
返回局部b
的原因是,正如那里所解释的,B
的 * 隐式删除的移动构造函数 * 不参与重载解析,因此编译器选择B
的默认复制构造函数。为了证明上述内容,请查看the following code,在
B
中添加一个仅可移动的成员: