const_cast vs static_cast

时间:2010-08-04 03:13:22

标签: c++ casting const implicit-conversion

要将const添加到非const对象,这是首选方法? const_cast<T>static_cast<T>。在最近的一个问题中,有人提到他们更喜欢使用static_cast,但我认为const_cast会使代码的意图更加清晰。那么使用static_cast制作变量const的论点是什么?

4 个答案:

答案 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_castconst_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;
}