小编chy*_*ojn的帖子

为什么隐式删除移动构造函数调用复制构造函数?

隐式删除的移动构造函数(C 的移动)看起来像未声明的移动,编译器尝试使用复制构造函数(C 的复制)。

为什么存在差异之间隐含删除移动(C的举动),并明确删除移动(B的举动)?

有一些解释,还有更多细节吗?

为什么移动构造函数既没有用 clang 声明也没有删除?

@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)

constructor move c++11

5
推荐指数
1
解决办法
2387
查看次数

标签 统计

c++11 ×1

constructor ×1

move ×1