gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:32:00 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com