隐式删除的移动构造函数(C 的移动)看起来像未声明的移动,编译器尝试使用复制构造函数(C 的复制)。
为什么存在差异之间隐含删除移动(C的举动),并明确删除移动(B的举动)?
有一些解释,还有更多细节吗?
@dyp 评论:
因为没有声明隐式删除的移动构造函数
并链接到 DR1402:
http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#1402
定义为已删除的默认移动构造函数会被重载决议 (13.3 [over.match]) 忽略。[注意:删除的移动构造函数会干扰从可以使用复制构造函数代替的右值的初始化。——尾注]
http://en.cppreference.com/w/cpp/language/move_constructor
(C++14 起)重载决议忽略已删除的隐式声明的移动构造函数(否则会阻止从右值进行复制初始化)
示例代码:
#include <utility>
class A {
public:
A() = default;
A(const A&) = delete;
A(A&&) = delete;
};
class B : public A {
public:
B() = default;
B(const B&) = delete;
B(B&&) = delete; // explicitly deleted move
};
class C: public A {
public:
C() = default;
C(const C&) = default; …Run Code Online (Sandbox Code Playgroud)