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

时间:2015-02-12 13:02:35

标签: c++ gcc

我有以下简单的结构

  struct crazy
    {
     const int i = 10;
     };

显然不可复制。事实上,如果我有两个这种类型的对象,比如说 object1和object2,并尝试类似

的语句
  object1 = object2;

我处理的两个编译器,即clang 3.4.2和gcc 4.8.3(好吧,它们可能已经过时了......),抱怨并拒绝合理的代码 类似的诊断。

但是为什么在这种情况下,gcc也会在初始化时检测到错误 const成员我?无论我用“constexpr”改变“const”,都会检测到这样的错误。

1 个答案:

答案 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成员的初始化没有任何关系。

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