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)
既然const是x,它必须被初始化 - 但是默认的ctor通常不会初始化它(因为它是POD类型).因此,要获取默认ctor,您需要自己定义一个(并且必须初始化const).您可以使用作为参考的成员获得相同的情况:
class X {
whatever &x;
};
Run Code Online (Sandbox Code Playgroud)
值得注意的是,这两者也会禁用隐式创建赋值运算符,原因大致相同.隐式赋值运算符通常执行成员分配,但在这些情况下它不能,因为该成员是无法分配的成员.要使赋值工作,您需要编写自己的赋值运算符.
这就是为什么一个X::x成员通常应该是静态的 - 当你做一个赋值时,你无论如何都不能分配const成员.在典型情况下,所有实例都将具有相同的值,因此它们可以共享对单个变量的访问权限,而不是拥有大量具有相同值的变量副本.
当然,可以创建具有不同值的实例 - 您(例如)在创建对象时传递值,因此两个不同的对象可以具有两个不同的值.但是,如果您尝试执行诸如交换它们之类的操作,则const成员将保留其原始值而不是交换.
Alo*_*ave 10
您正在使用标记为的功能deleted.
例如:
int doSomething( int ) = delete;
Run Code Online (Sandbox Code Playgroud)
= delete是C++ 0x的新功能.这意味着一旦用户使用这样的功能,编译器应立即停止编译并抱怨"此功能被删除".
如果看到此错误,则应检查函数声明=delete.
要了解有关C++ 0x中引入的这一新功能的更多信息,请查看此信息.