删除的副本分配检测到虚假错误?

GSi*_*GSi 3 c++ gcc

我有以下简单的结构

  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",都会检测到这样的错误.

Mik*_*our 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
Run Code Online (Sandbox Code Playgroud)

第一个错误是因为删除了赋值运算符,正如您所说.第二部分是说明它被删除的原因的一部分:如果未删除默认定义将生成的错误.既没有与const成员的初始化有任何关系.

如果你问为什么编译器认为你可能想要两者:因为两者都有助于诊断问题.也许你不应该复制对象,在这种情况下,第一个告诉你不能.也许你想,在这种情况下第二个告诉你为什么你不能.