如何避免已弃用的副本警告?

How to avoid deprecated-copy warnings?

提问人:Adrian K-B. 提问时间:11/8/2022 最后编辑:Adrian K-B. 更新时间:11/17/2022 访问量:3562

问:

下面是一些简化的代码。它不是我的,但我正在为我的一个项目改编它。它是我正在导入的大型代码库的一部分,除非绝对必要,否则我不想对其进行更改。

void function (object& out_thing)
{
 object thing;
#pragma omp nowait
 for (int k = 0 ; k < 5 ; k++) {
  object* things[2];
  float scores[2];
  for (i = 0; i < 2 ; i++)
   scores[i] = evaluateThings(things[i], parameter1, parameter2);
   if (scores[1] < scores[0]) {
    scores[0] = scores[1];
    things[0] = things[1];
   }
  thing = *(things[0]);
 }
 out_thing = thing;
}

编译时,我收到警告,说隐式声明的 thing = *(things[0]) 和 out_thing = thing 已弃用 [-Wdeprecated-copy],因为我有一个用户提供的复制构造函数。

我想编译器希望我写,但我不能,因为我需要在 omp 编译指示之前声明,而且我不能在最后写,因为out_thing已经定义为传递给函数的参数之一。object thing(*(things[1])object thingobject out_thing(thing)

有没有办法重新编码以摆脱警告?

(我实际上可以通过更改为然后再更改为来摆脱第一个,但这需要我更改为并且我仍然收到该已弃用副本的警告;理想情况下,如果可以的话,我想摆脱两者,而无需在代码库的其他地方进行大量更改,并且不会对性能造成损害等。object thing;object* thing = NULLthing = *(things[0]);thing = things[0];out_thing = thing;out_thing = *thing;

C++ 警告

评论

0赞 Adrian K-B. 11/11/2022
对不起,这是试图尽可能简单地表示实际代码的错别字。我现在已经解决了这个问题。
0赞 273K 11/11/2022
显示一个最小的可重现示例,至少类对象定义。

答:

6赞 273K 11/11/2022 #1

当存在用户声明的析构函数时,警告丢失/删除用户声明的复制分配运算符。如果存在用户声明的析构函数,则缺少复制构造函数或复制赋值运算符可能是代码中的错误。应添加自定义复制分配运算符-Wdeprecated-copy~object

object& operator=(const object&);

请参阅什么是三法则?

评论

0赞 Adrian K-B. 11/11/2022
谢谢你,这就是我所缺少的。我有一个复制构造函数,但没有复制赋值运算符。
0赞 Durbar_19 11/16/2022 #2

当编译器在代码中出现析构函数时,通常会触发此警告。因此,请检查代码中可能遗漏了复制赋值运算符的此类情况。