在已删除的副本分配中检测到虚假错误

Spurious errors detected with deleted copy assignment?

本文关键字:检测 错误 分配 删除 副本      更新时间:2023-10-16

我有以下琐碎的结构

  struct crazy
    {
     const int i = 10;
     };

这显然是不可复制的。事实上,如果我有两个这样的对象,比如对象1和对象2,并尝试类似的语句

  object1 = object2;

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

但是,为什么在这种情况下,gcc在const成员i?无论我将"const"改为"constexpr",都会检测到这样的错误。

我得到的错误是:

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成员的初始化无关。

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