错误:使用已删除的函数

2023-12-05

我一直在处理朋友编写的一些 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’

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

编辑2:没有= delete()在源代码的任何地方使用。

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


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

class X {
    const int x;
};

Since X::x is const,它必须被初始化——但是默认的 ctor 通常不会初始化它(因为它是 POD 类型)。因此,要获得默认的 ctor,您需要自己定义一个(并且它必须初始化x)。您可能会遇到与参考成员相同的情况:

class X { 
    whatever &x;
};

可能值得注意的是,出于本质上相同的原因,这两者也将禁用赋值运算符的隐式创建。隐式赋值运算符通常执行按成员赋值,但对于 const 成员或引用成员,它不能执行此操作,因为无法对成员进行赋值。为了使赋值起作用,您需要编写自己的赋值运算符。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

错误:使用已删除的函数 的相关文章

随机推荐