假設我使用它實現的功能foo
圖書館和我的代碼可能是這個樣子:對API的功能參數常量,正確性改變
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;
}
用此修復程序,該程序再次開始工作。不過,我必須說,我沒有看到許多這樣的代碼,因爲大家似乎都相信這種類型的錯誤不會發生。另外,這似乎是不必要的冗長,如果有多個參數並且名稱開始變長,函數調用就會變得非常混亂。
這是一個合理的關注點,我應該怎麼做呢?
這不是'const_cast'的目的,它的目的是_remove_類型的'const'限定。你的例子''static_cast'也可以。 –
@CaptainObvlious http://www.cplusplus.com/doc/tutorial/typecasting/在這裏它說:「這種類型的鑄造操縱對象的常量,要麼被設置要麼被刪除。」這是不正確的? – Svalorzen
@Svalorzen它可以用於此,但它不應該。這不是該任務的最小工具。該任務的最小工具是'static_cast'。 – 2013-07-04 23:01:11