关于隐式删除复制/移动构造函数的情况有一条规则:
隐式声明的复制/移动构造函数是内联公共 同类的成员。 X类的默认复制/移动构造函数 如果X有:
,则定义为已删除(8.4.3)[...]
- 类型的任何直接或虚拟基类或非静态数据成员 使用从默认值中删除或无法访问的析构函数 构造函数,或
[...]
因为我找不到反映规则的例子,所以我不清楚。请考虑以下代码:
struct A
{
~A() = delete;
};
struct B : A
{
A a;
B(){ }; //error error: attempt to use a deleted function B(){ };
B(const B&&) = delete;
};
B *b = new B;
int main() { }
由于删除了移动构造函数没有参与重载解析,我预计错误将类似于“隐式删除复制构造函数”。但我得到了关于已明确定义的已删除B()
的错误。你能提供反映这条规则的例子吗?
答案 0 :(得分:0)
仅根据您提供的摘录,以下是一个示例:
struct inner
{
~inner() = delete;
};
struct outer
{
inner inst;
// Can't destroy "inst"; outer now has an implicitly
// deleted destructor and copy/move constructor.
};
答案 1 :(得分:0)
请看第5点:显然已经删除了您的基类dtor,因此您遇到了这个问题。
link:http://en.cppreference.com/w/cpp/language/default_constructor
删除了隐式声明的默认构造函数
如果满足以下任何条件,则类T的隐式声明或默认默认构造函数未定义(直到C ++ 11)被定义为已删除(自C ++ 11开始):
T具有引用类型的成员,没有大括号或等号 初始化。 (自C ++ 11起)
T有一个没有用户定义的默认构造函数的const成员或者 支持或相等的初始化程序(自C ++ 11起)。
T有一个成员(没有支持或相等的初始化程序)(从C ++ 11开始), 它有一个已删除的默认构造函数或其默认构造函数 这个构造函数是模糊的或不可访问的。
T具有默认删除的直接或虚拟基础 构造函数,或者它是模糊的或不可访问的 构造
T有一个直接或虚拟的基础,它有一个删除的析构函数,或者 从此构造函数无法访问的析构函数。
T是一个至少有一个变异成员与非平凡成员的联盟 默认构造函数。 (自C ++ 11起)
- T是一个联合,其所有变体成员都是const。
醇>