【发布时间】:2019-07-22 15:10:23
【问题描述】:
我正在尝试删除所有隐式提供的复制/移动 ctor/赋值运算符,但为什么我仍然能够显式删除应该隐式删除的默认 ctor?
我尝试了 =default-ing 隐式提供的所有复制/移动 ctor/assignment 运算符,然后才被告知实际 =delete 而不是 =default。如果我对隐式/显式的理解是正确的,那么如果用户提供了显式的复制 ctor,则默认的 ctor 应该被隐式删除。
我有以下课程:
class A {
public:
A() =delete;
A(const A&):...{;} --> my explicitly defined copy ctor
...
}
我希望编译器告诉我我不能 =delete 隐式删除的默认 ctor,但事实并非如此。我正在使用clang8进行编译。
【问题讨论】:
-
告诉编译器你想删除它无论如何都会删除的东西会有什么问题?
-
我有很多基类和子类,在处理继承和 const 成员变量时,我试图删除尚未删除的内容,以建立规范以施加限制。我不希望下一个程序员必须查找继承链来尝试找出尚未隐式删除的内容。
-
如果编译器没有生成函数,它不会被用作可能的匹配。如果你明确地
=delete一个函数,它仍然可能被认为是可能的最佳匹配,然后编译器会出错,说函数已被删除。