我有以下简单的结构
struct crazy
{
const int i = 10;
};
Run Code Online (Sandbox Code Playgroud)
这显然是不可复制的.确实,如果我有两个这种类型的对象,比如object1和object2,并尝试一个类似的语句
object1 = object2;
Run Code Online (Sandbox Code Playgroud)
我处理的两个编译器,即clang 3.4.2和gcc 4.8.3(好吧,它们可能已经过时了......),抱怨并拒绝使用合理和类似诊断的代码.
但是为什么在那种情况下,gcc在const成员i的初始化中也检测到错误?无论我用"constexpr"改变"const",都会检测到这样的错误.
我得到的错误是:
test.cpp: In function ‘int main()’:
test.cpp:10:13: error: use of deleted function ‘crazy& crazy::operator=(const crazy&)’
object1 = object2;
^
test.cpp:3:8: note: ‘crazy& crazy::operator=(const crazy&)’ is implicitly deleted because the default definition would be ill-formed:
struct crazy
^
test.cpp:3:8: error: non-static const member ‘const int crazy::i’, can’t use default assignment operator
Run Code Online (Sandbox Code Playgroud)
第一个错误是因为删除了赋值运算符,正如您所说.第二部分是说明它被删除的原因的一部分:如果未删除默认定义将生成的错误.既没有与const成员的初始化有任何关系.
如果你问为什么编译器认为你可能想要两者:因为两者都有助于诊断问题.也许你不应该复制对象,在这种情况下,第一个告诉你不能.也许你想,在这种情况下第二个告诉你为什么你不能.