如何避免不推荐使用的副本警告?

Adr*_*-B. 3 c++ warnings

这是一些简化的代码。它不是我的,但我正在将其改编为我的一个项目。它是我正在导入的庞大代码库的一部分,除了绝对必要之外,我不想对其进行更多更改。

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

有什么方法可以重新编码以消除警告吗?

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

S.M*_*.M. 6

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

object& operator=(const object&);
Run Code Online (Sandbox Code Playgroud)

请参阅什么是三法则?