首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:使用已删除的函数

错误:使用已删除的函数
EN

Stack Overflow用户
提问于 2011-05-11 23:25:06
回答 6查看 266.8K关注 0票数 144

我一直在编写一位朋友写的一些C++代码,在使用GCC4.6编译时,我得到了以前从未见过的以下错误:

代码语言:javascript
复制
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’

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

Edit2:源代码中的任何位置都没有使用= delete()

一般来说,这个错误是什么意思?当这种类型的错误发生时,我应该寻找什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-05-11 23:35:32

错误消息清楚地表明默认构造函数已被隐式删除。它甚至说明了原因:该类包含一个非静态的const变量,该变量不会被默认的ctor初始化。

代码语言:javascript
复制
class X {
    const int x;
};

由于X::xconst,因此必须对其进行初始化--但默认的ctor通常不会对其进行初始化(因为它是POD类型)。因此,要获得默认的ctor,您需要自己定义一个(并且它必须初始化x)。你可以用一个引用的成员得到同样的情况:

代码语言:javascript
复制
class X { 
    whatever &x;
};

可能值得注意的是,由于本质上相同的原因,这两种方法还将禁用赋值操作符的隐式创建。隐式赋值运算符通常执行成员级赋值,但对于常量成员或引用成员,它无法执行此操作,因为该成员无法被赋值。要使赋值工作,您需要编写自己的赋值运算符。

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

当然,也可以创建具有不同值的实例--例如,在创建对象时传递一个值,因此两个不同的对象可以有两个不同的值。但是,如果您尝试交换它们,const成员将保留其原始值,而不是被交换。

票数 193
EN

Stack Overflow用户

发布于 2011-05-11 23:28:50

您正在使用一个标记为deleted的函数。

例如:

代码语言:javascript
复制
int doSomething( int ) = delete;

=delete是C++0x的一个新特性。这意味着一旦用户使用了这个函数,编译器应该立即停止编译,并抱怨“这个函数被删除了”。

如果您看到此错误,则应检查函数声明中是否有=delete

要了解有关C++0x中引入的这个新特性的更多信息,请查看this

票数 12
EN

Stack Overflow用户

发布于 2011-05-11 23:32:42

gcc 4.6支持删除函数的新功能,您可以在其中编写

代码语言:javascript
复制
hdealt() = delete;

若要禁用默认构造函数,请执行以下操作。

在这里,编译器显然已经看到不能生成默认构造函数,并且=delete为您创建了它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5966698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档