假设我正在使用一个实现 function 的库foo
,我的代码可能如下所示:
void foo(const int &) { }
int main() {
int x = 1;
foo(x);
std::cout << (1/x) << std::endl;
}
一切正常。foo
但是现在假设由于某种原因在某一时刻被修改或重载。现在我们得到的可能是这样的:
void foo(int & x) {
x--;
}
void foo(const int &) {}
int main() {
int x = 1;
foo(x);
std::cout << (1/x) << std::endl;
}
巴姆。程序突然中断。这是因为我们实际上想要在该片段中传递的是一个常量引用,但是随着 API 的突然变化,编译器选择了我们不想要的版本,程序意外中断。
我们想要的实际上是这样的:
int main() {
int x = 1;
foo(static_cast<const int &>(x));
std::cout << (1/x) << std::endl;
}
通过此修复程序,程序再次开始工作。但是,我必须说我在代码中没有看到很多这样的转换,因为每个人似乎都只是相信不会发生这种类型的错误。此外,这似乎是不必要的冗长,如果有多个参数并且名称开始变长,函数调用就会变得非常混乱。
这是一个合理的担忧吗?我应该怎么做?