这是一些简化的代码。它不是我的,但我正在将其改编为我的一个项目。它是我正在导入的庞大代码库的一部分,除了绝对必要之外,我不想对其进行更多更改。
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;
-Wdeprecated-copy当存在用户声明的析构函数时,该警告会警告用户声明的复制赋值运算符丢失/删除~object。如果存在用户声明的析构函数,则缺少复制构造函数或复制赋值运算符可能是代码中的错误。您应该添加自定义复制分配运算符
object& operator=(const object&);
Run Code Online (Sandbox Code Playgroud)
请参阅什么是三法则?。
| 归档时间: |
|
| 查看次数: |
4573 次 |
| 最近记录: |