我有以下简单的结构
struct crazy
{
const int i = 10;
};
显然不可复制。事实上,如果我有两个这种类型的对象,比如说 object1和object2,并尝试类似
的语句 object1 = object2;
我处理的两个编译器,即clang 3.4.2和gcc 4.8.3(好吧,它们可能已经过时了......),抱怨并拒绝合理的代码 类似的诊断。
但是为什么在这种情况下,gcc也会在初始化时检测到错误 const成员我?无论我用“constexpr”改变“const”,都会检测到这样的错误。
答案 0 :(得分:5)
我得到的错误是:
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
第一个错误是因为删除了赋值运算符,正如您所说。第二部分是说明它被删除的原因的一部分:如果未删除默认定义将生成的错误。这与const成员的初始化没有任何关系。
如果你问为什么编译器认为你可能都想要两者:因为两者都有助于诊断问题。也许你不应该复制对象,在这种情况下,第一个告诉你不能。也许你想要,在这种情况下第二个告诉你为什么你不能。