考虑一个防止复制构造和复制分配的基类,如下所示:
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