首页 > 解决方案 > 强制编译器在未使用基类删除的复制 ctor 定义的移动构造函数上发出错误

问题描述

考虑一个防止复制构造和复制分配的基类,如下所示:

class NonCopyable {
    public:
        NonCopyable() = default;
        ~NonCopyable() = default;

        NonCopyable(NonCopyable const&)                 = delete;
        NonCopyable& operator=(NonCopyable const&)      = delete;
};

我们的开发人员现在可以包含这个类,并使用它来禁用继承类的复制,如下所示:

class CopyTest : public NonCopyable {
    public:
        CopyTest() {
            std::cout << "copy test created" << std::endl;
        }

        ~CopyTest() {
            std::cout << "copy test deleted" << std::endl;
        }
};

当我尝试使用CopyTest该类时:

CopyTest ct, ct1(ct);

或者

CopyTest ct;
CopyTest ct1 = ct2;

编译器发出错误:(use of deleted function xxx其中 xxx 是我删除的复制 ctor 或复制运算符)

然后,如果我想要std::move一个CopyTest对象:

CopyTest ct;
CopyTest ct1 = std::move(ct);

编译器发出相同的错误(使用已删除的函数 xxx - 其中 xxx 仍然是我的复制 ctor 或赋值运算符)。

如果我提醒正确,那是因为开发人员没有定义正确的移动 ctor/赋值运算符。

是否可以强制编译器告诉CopyTest类的开发人员移动错误在这里,因为他没有定义正确的移动 ctor/赋值运算符,而不是因为复制 ctor/赋值运算符在基类上被删除?

平台 :

Debian 9

海合会 6.3.0

编译标志:

-fpermissive -ggdb -std=c++11

标签: c++c++11inheritancedeleted-functions

解决方案


添加

    NonCopyable(NonCopyable &&)                 = delete;
    NonCopyable& operator=(NonCopyable &&)      = delete;

现在抱怨基类移动ctor被删除。


推荐阅读