要将const
添加到非const对象,这是首选方法? const_cast<T>
或static_cast<T>
。在最近的一个问题中,有人提到他们更喜欢使用static_cast
,但我认为const_cast
会使代码的意图更加清晰。那么使用static_cast
制作变量const的论点是什么?
答案 0 :(得分: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
只应用于抛弃 constness,因为它是唯一可以这样做的演员,而抛弃常量本质上是危险的。通过抛弃const而获得的指针或引用修改对象可能会导致未定义的行为。
答案 1 :(得分:2)
我认为static_cast
更可取,因为它只允许你从非const
投射到const
(这是安全的),而不是从另一个方向投射(不一定安全。)
答案 2 :(得分:2)
这是implicit_cast函数模板的一个很好的用例。
答案 3 :(得分:1)
你可以写自己的演员:
template<class T>
const T & MakeConst(const T & inValue)
{
return inValue;
}