如何声明C ++变量应进行突变

时间:2019-05-24 16:26:19

标签: c++

最近,我有一个错误,我们将功能从以下位置更改了

void update_waypoint_heading(const double new_observation, waypoint)
{
   // ....
   waypoint.heading = default_heading_deg * waypoint.some_magic_number
}


// Call the function and the function will calculate new heading and mutate heading in waypoint
update_waypoint_heading(new_observation, waypoint);

double update_waypoint_heading(const double new_observation, waypoint)
{
   // ....
   return default_heading_deg * waypoint.some_magic_number
}

// Here the caller is supposed to be responsible for mutation
waypoint.heading = update_waypoint_heading(new_observation, waypoint);

我们有一个错误,我们在其中更改了功能,但没有更改调用方。所以我们结束了

update_waypoint_heading(new_observation, waypoint);

update_waypoint_heading开始返回新标题的位置。但是它从来没有被设置为路标。这对于编译器也是完全合法的。

是否可以将参数声明为mutant(类似于const的参数),如果不进行突变,它将在其中引发编译器错误。这样我就可以在编译时捕获这些情况

1 个答案:

答案 0 :(得分:4)

不,这也没有多大意义。

您将参数传递给函数,并希望使用关键字来强制调用范围将函数的结果分配给您作为参数传递的同一事物的某些部分吗?

这很令人费解。

如果一个函数返回了应该使用的结果,那么将通过其返回类型对其进行记录。如果它修改了其按引用参数,那么也应该记录下来。使用该功能获得代码后,请勿从一个切换到另一个!

如何!nodiscard attribute可以防止简单地将调用函数的结果丢弃。那将有flagged this case up,也许正是您真正想要的。

您将需要一个不错的C ++ 17编译器来使用它。

尽管如此,我仍然认为这有点漏水。由您的功能来决定调用范围对其结果进行处理是不完全的。只是不要更改函数语义!如果需要,请使用新名称编写一个新函数。无论如何,“更新”不再是一个好的描述性名称。