提问人:Adrian K-B. 提问时间:11/8/2022 最后编辑:Adrian K-B. 更新时间:11/17/2022 访问量:3562
如何避免已弃用的副本警告?
How to avoid deprecated-copy 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;
}
编译时,我收到警告,说隐式声明的 thing = *(things[0]) 和 out_thing = thing 已弃用 [-Wdeprecated-copy],因为我有一个用户提供的复制构造函数。
我想编译器希望我写,但我不能,因为我需要在 omp 编译指示之前声明,而且我不能在最后写,因为out_thing已经定义为传递给函数的参数之一。object thing(*(things[1])
object thing
object out_thing(thing)
有没有办法重新编码以摆脱警告?
(我实际上可以通过更改为然后再更改为来摆脱第一个,但这需要我更改为并且我仍然收到该已弃用副本的警告;理想情况下,如果可以的话,我想摆脱两者,而无需在代码库的其他地方进行大量更改,并且不会对性能造成损害等。object thing;
object* thing = NULL
thing = *(things[0]);
thing = things[0];
out_thing = thing;
out_thing = *thing;
答:
当存在用户声明的析构函数时,警告丢失/删除用户声明的复制分配运算符。如果存在用户声明的析构函数,则缺少复制构造函数或复制赋值运算符可能是代码中的错误。应添加自定义复制分配运算符-Wdeprecated-copy
~object
object& operator=(const object&);
请参阅什么是三法则?。
评论
当编译器在代码中出现析构函数时,通常会触发此警告。因此,请检查代码中可能遗漏了复制赋值运算符的此类情况。
评论