要將const
添加到非const對象,這是首選方法? const_cast<T>
或static_cast<T>
。在最近的一個問題中,有人提到他們更喜歡使用static_cast
,但我會認爲const_cast
會使代碼的意圖更加清晰。那麼使用static_cast
來創建一個變量const的參數是什麼?const_cast vs static_cast
11
A
回答
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_cast
和const_cast
之間的選擇,static_cast
絕對是最好:const_cast
應只能用於拋棄因爲它是唯一能夠這樣做的演員陣容,而拋棄常量本身就是危險的。通過轉換常量獲得的指針或引用修改對象可能會導致未定義的行爲。
2
我會說static_cast
是最好的,因爲它只允許你從非const
轉換爲const
(這是安全的),而不是在另一個方向(這不一定安全)。
+0
這似乎與斯科特邁爾斯的觀點相符;請參閱「避免重複...」示例中的_Effective C++ _,第3項。 – 2014-07-31 17:24:55
2
這是一個很好的implicit_cast函數模板的用例。
1
你可以寫你自己的投:
template<class T>
const T & MakeConst(const T & inValue)
{
return inValue;
}
相關問題
- 1. static_cast vs dynamic_cast
- 2. Shared_ptr cast vs static_cast速度
- 3. 的static_cast無效*字符* VS的static_cast無效**字符**
- 4. const_cast VS可變嗎?有什麼區別?
- 5. static_cast <int>(foo)vs.(int)foo
- 6. 的const_cast和UB
- 7. static_cast safety
- 8. C++的const_cast問題
- 9. const_cast會與對象
- 10. const_cast是否安全?
- 11. 使用的static_cast
- 12. C++ std :: forward <T> vs static_cast <T>
- 13. const_cast問題與std :: map
- 14. const_cast似乎被C++模板忽略了?
- 15. 空調風格的演員和C++的static_cast到指針
- 16. static_cast的神祕行爲
- 17. static_cast派生類的接口
- 18. static_cast的特殊規則
- 19. 重複繼承和的static_cast
- 20. const_cast C++對我不起作用
- 21. 這是const_cast未定義的行爲?
- 22. 未定義的行爲與const_cast
- 23. const_cast <const Type*>有用嗎?
- 24. 通行證常量數據的功能服用非const沒有的const_cast
- 25. 爲什麼減法與static_cast溢出?
- 26. static_cast和C++中的虛擬方法
- 27. 錯誤:的static_cast undeclared->目標C
- 28. 的static_cast在默認參數值
- 29. 調用派生c + +與static_cast Mixins
- 30. 的static_cast無法施展矢量
大多數鑄件可以是 「危險的」。 – curiousguy 2011-12-20 21:32:25
Scott Meyers給出了一個將'static_cast'用於'const'的例子,後面跟着一個'const_cast'來使'operator []'的非'const'版本調用'const'版本。使用const引用可以達到同樣的效果嗎? – 2014-07-31 17:42:37
看起來你*可以*通過實例化一個新的const引用來替換'static_cast',但是當然你仍然必須使用'const_cast'來返回一個非const引用。我不確定這是編譯器還是特定於平臺的行爲,或者它是否被標準中的任何要求所暗示。 – 2014-07-31 23:19:41