2010-08-04 52 views
11

要將const添加到非const對象,這是首選方法? const_cast<T>static_cast<T>。在最近的一個問題中,有人提到他們更喜歡使用static_cast,但我會認爲const_cast會使代碼的意圖更加清晰。那麼使用static_cast來創建一個變量const的參數是什麼?const_cast vs static_cast

回答

14

請勿使用。初始化是指對象const引用:

T x; 
const T& xref(x); 

x.f();  // calls non-const overload 
xref.f(); // calls const overload 

或者,使用implicit_cast函數模板,像the one provided in Boost

T x; 

x.f();       // calls non-const overload 
implicit_cast<const T&>(x).f(); // calls const overload 

鑑於static_castconst_cast之間的選擇,static_cast絕對是最好:const_cast應只能用於拋棄因爲它是唯一能夠這樣做的演員陣容,而拋棄常量本身就是危險的。通過轉換常量獲得的指針或引用修改對象可能會導致未定義的行爲。

+0

大多數鑄件可以是 「危險的」。 – curiousguy 2011-12-20 21:32:25

+0

Scott Meyers給出了一個將'static_cast'用於'const'的例子,後面跟着一個'const_cast'來使'operator []'的非'const'版本調用'const'版本。使用const引用可以達到同樣的效果嗎? – 2014-07-31 17:42:37

+0

看起來你*可以*通過實例化一個新的const引用來替換'static_cast',但是當然你仍然必須使用'const_cast'來返回一個非const引用。我不確定這是編譯器還是特定於平臺的行爲,或者它是否被標準中的任何要求所暗示。 – 2014-07-31 23:19:41

2

我會說static_cast是最好的,因爲它只允許你從非const轉換爲const(這是安全的),而不是在另一個方向(這不一定安全)。

+0

這似乎與斯科特邁爾斯的觀點相符;請參閱「避免重複...」示例中的_Effective C++ _,第3項。 – 2014-07-31 17:24:55

1

你可以寫你自己的投:

template<class T> 
const T & MakeConst(const T & inValue) 
{ 
    return inValue; 
}