【发布时间】:2018-12-12 16:18:27
【问题描述】:
考虑一个防止复制构造和复制分配的基类,如下所示:
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/assignement 运算符,而不是因为复制 ctor/assignement运算符在基类上被删除了吗?
平台:
Debian 9
GCC 6.3.0
编译标志:
-fpermissive -ggdb -std=c++11
【问题讨论】:
-
任何优秀的开发人员都知道这个错误的可能原因是缺少移动构造函数(毕竟他是使用
std::move)。我不会担心的。 -
我同意你的观点,但我不想依赖其他人也不想依赖我可能的技能,并认为像我这样的初学者更容易理解确切的编译器错误......跨度>
-
编译器错误是exact:隐式定义的move构造函数被删除,因为copy ctor是。
标签: c++ c++11 inheritance deleted-functions