错误:使用已删除的功能

shu*_*e87 101 c++ gcc g++ deleted-functions c++11

我一直在研究朋友编写的一些C++代码,并且我在使用gcc4.6编译时遇到了以前从未见过的错误:

error: use of deleted function

‘GameFSM_<std::array<C, 2ul> >::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed:
uninitialized non-static const member ‘const h_t FlopPokerGameFSM_<std::array<C, 2ul> >::hdealt::h’
Run Code Online (Sandbox Code Playgroud)

编辑:这来自使用boost MSM:Boost网页的部分代码

Edit2:= delete()源代码中没有任何地方使用过.

一般来说,这个错误意味着什么?发生此类错误时,我应该寻找什么?

Jer*_*fin 153

我不认为提到X::x语法的其他答案是正确的.错误消息清楚地表明默认构造函数已被隐式删除.它甚至说明了原因:该类包含一个非静态的const变量,它不会被默认的ctor初始化.

class X {
    const int x;
};
Run Code Online (Sandbox Code Playgroud)

既然constx,它必须被初始化 - 但是默认的ctor通常不会初始化它(因为它是POD类型).因此,要获取默认ctor,您需要自己定义一个(并且必须初始化const).您可以使用作为参考的成员获得相同的情况:

class X { 
    whatever &x;
};
Run Code Online (Sandbox Code Playgroud)

值得注意的是,这两者也会禁用隐式创建赋值运算符,原因大致相同.隐式赋值运算符通常执行成员分配,但在这些情况下它不能,因为该成员是无法分配的成员.要使赋值工作,您需要编写自己的赋值运算符.

这就是为什么一个X::x成员通常应该是静态的 - 当你做一个赋值时,你无论如何都不能分配const成员.在典型情况下,所有实例都将具有相同的值,因此它们可以共享对单个变量的访问权限,而不是拥有大量具有相同值的变量副本.

当然,可以创建具有不同值的实例 - 您(例如)在创建对象时传递值,因此两个不同的对象可以具有两个不同的值.但是,如果您尝试执行诸如交换它们之类的操作,则const成员将保留其原始值而不是交换.

  • @OllieFord:这取决于.如果(例如)您将该字段中具有一个值的对象分配给该字段中具有不同值的另一个值,会发生什么?如果它应该被覆盖,那么它不能是const.如果根本不允许这样做,则该值可能实际上是该类型的一部分(例如,模板参数,如果在编译时已知). (2认同)

Alo*_*ave 10

您正在使用标记为的功能deleted.
例如:

int doSomething( int ) = delete;
Run Code Online (Sandbox Code Playgroud)

= delete是C++ 0x的新功能.这意味着一旦用户使用这样的功能,编译器应立即停止编译并抱怨"此功能被删除".

如果看到此错误,则应检查函数声明=delete.

要了解有关C++ 0x中引入的这一新功能的更多信息,请查看此信息.

  • 出于好奇,何时做这样的事情会有所帮助? (7认同)
  • 实际上它说'"隐式删除因为..."*,上面的例子是明确的. (7认同)

小智 5

当从抽象类继承并且未在子类中实现所有纯虚方法时,我遇到了此错误。