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

Posted

技术标签:

【中文标题】已删除的副本分配检测到虚假错误?【英文标题】:Spurious errors detected with deleted copy assignment? 【发布时间】:2015-02-12 13:02:34 【问题描述】:

我有以下琐碎的结构

  struct crazy
    
     const int i = 10;
     ;

这显然是不可复制的。确实,如果我有两个该类型的对象,请说 object1 和 object2,并尝试类似的语句

  object1 = object2;

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

但是,为什么在这种情况下,gcc 在初始化时也会检测到错误 常量成员我?无论我将“const”更改为“constexpr”,都会检测到此类错误。

【问题讨论】:

它们并没有严重过时;根据***,the current stable version of GCC is 4.9.2 和 the current stable version of clang is 3.5。 你在 gcc 中使用 -std=c++11 标志吗? @NathanOliver:当然;我做到了。 可复制的,但不可分配的。您正确地证明了这一点。 你提到的第三个错误是error: non-static const member 'const int crazy::i', can't use default assignment operator吗?只是g++附带了一些额外的输出,这和前两个抱怨的意思是一样的。 【参考方案1】:

我得到的错误是:

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

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

【讨论】:

我相信这是OP询问的clangg++之间的输出错误差异-clang只产生一个错误和一个注释,而g ++产生两个错误和一个注释。来自 g++ 的第二个错误似乎是从 clang (note: copy assignment operator of 'crazy' is implicitly deleted because field 'i' is of const-qualified type 'const int') 进入注释中的一个细节 @Petesh:确实,不同的作者在错误消息的细节和简洁性之间做出了不同的决定,所以一个比另一个略长,信息量更大。但这不是一个特别有趣或可回答的问题。我正在回答为什么 GCC 会提供额外信息的问题,因为这是被问到的。

以上是关于已删除的副本分配检测到虚假错误?的主要内容,如果未能解决你的问题,请参考以下文章

Kafka集群副本分配算法解析

C中的chmod分配错误的权限

SAP中怎么删除BOM组件中的其中一个组件,点删除显示已被分配给任务清单删除不了怎么办?

csharp 这是创建虚假用户并将该假用户分配给控制器上下文以用于创建使用用户的测试的示例。

来自 NIO Direct ByteBuffer 的 Android RenderScript 分配副本

将尚未分配的 ID 分配给新实体