c++ - 强制编译器在未使用基类删除的复制 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
解决方案
添加
NonCopyable(NonCopyable &&) = delete;
NonCopyable& operator=(NonCopyable &&) = delete;
现在抱怨基类移动ctor被删除。
推荐阅读
- websphere - WebSphere Portal 8.5(CTC 模板)上的链接不会在移动设备上打开 url,而只能在新选项卡上打开
- arrays - 数组之间交换值的问题
- node.js - http请求上的Ubuntu 20.04服务器超时
- php - 类中匿名函数的内存泄漏?
- javascript - 根据从多选下拉列表中选择的价格数据总和
- c# - 一个看似简单的 RaycastALL 统一问题我想不通
- python - 虽然循环“继续”在尝试中不起作用,但最终除外
- next.js - 尝试将 Nextjs 部署到 Vercel 时出现错误
- windows - 我刚买了一台装有 Windows 10 的新电脑,每次尝试打开 GitBash 时都会出现错误消息
- python - 在 Keras 中合并多个模型(张量流)