c++ - API 更改时函数参数的常量正确性

标签 c++ function c++11 arguments constants

假设我正在使用一个实现函数 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;
}

通过此修复,程序再次开始工作。但是,我必须说我在代码中并没有看到很多这样的转换,因为每个人似乎都相信这种类型的错误不会发生。此外,这似乎不必要地冗长,如果有多个参数并且名称开始变长,函数调用就会变得非常困惑。

这是一个合理的担忧吗?我该如何解决?

最佳答案

如果您更改一个采用 const 引用的函数,使其不再是 const,您很可能会破坏某些东西。这意味着您必须检查调用该函数的每个地方,并确保它是安全的。在这种情况下,进一步拥有两个同名函数,一个带有 const,一个不带 const 绝对是一个糟糕的计划。

正确的做法是创建一个新函数,它执行 x-- 变体,使用与现有函数不同的名称。

任何做这种事情的 API 供应商都应该受到严厉的体罚,如果文档中有一个 BIG 通知说“我们已经更改了函数 foo,它现在递减 x 除非参数被强制转换为 const”。这是人们能想象到的最糟糕的二进制中断之一(就“很难找出问题所在”而言)。

关于c++ - API 更改时函数参数的常量正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17479028/

相关文章:

javascript - 单击按钮查找两个数字中的最大值

c++ - `intmax_t` 在具有 64 位 `long int` 和 `long long int` 的平台上应该是什么?

c++ - std::packaged_task 编译错误 w/gcc 4.6

c++ - 尝试在模板类中使用单个类变量

c++ - 不理解这个二叉搜索树 (BST) 示例算法

c++ - 从 SQLite 中的准备语句获取原始 SQL 查询

javascript - JavaScript 剪刀石头布游戏的游戏计数器无法正常工作

c - 如何从不同的函数访问 C 中的变量?

c++ - 将一些输出重定向到命令提示符,将一些输出重定向到文件?

c++ - 如何获取设置的输入文件路径运行时?