API变化的函数参数的正确性

时间:2013-07-04 22:55:14

标签: c++ function c++11 arguments const

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

BAM。程序突然中断了。这是因为我们实际想要在该片段中传递的是一个常量引用,但是随着API的突然改变,编译器会选择我们不想要的版本并且程序会意外中断。

我们想要的实际上就是这样:

int main() {
    int x = 1;
    foo(static_cast<const int &>(x));
    std::cout << (1/x) << std::endl;
}

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

这是一个合理的问题,我应该怎么做呢?

1 个答案:

答案 0 :(得分:1)

如果更改一个带有const引用的函数,使它不再是const,那么你可能会破坏它。这意味着您必须检查调用该函数的每个位置,并确保它是安全的。在这种情况下,还有两个具有相同名称的函数,一个具有const而另一个没有const,这绝对是一个糟糕的计划。

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

任何执行此类操作的API供应商都应受到严厉和严厉的惩罚,如果文档中有大的通知说“#34;我们已更改功能foo,现在可能会略微减少暴力行为除非将参数强制转换为const&#34;否则递减x。这是人们可以想象的最糟糕的二进制中断之一(根据&#34;它很难找出出了什么问题&#34;)。