12

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

4

4 回答 4

17

也不要使用。初始化一个引用对象的 const 引用:

T x;
const T& xref(x);

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

或者,使用implicit_cast函数模板,例如Boost 中提供的模板:

T x;

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

static_cast考虑到和之间的选择const_caststatic_cast绝对是更可取的: const_cast应该只用于丢弃constness,因为它是唯一可以这样做的演员,并且丢弃 constness 本质上是危险的。通过丢弃 const 获得的指针或引用修改对象可能会导致未定义的行为。

于 2010-08-04T03:15:46.800 回答
3

我想说static_cast的是最好的,因为它只允许你从非constconst(这是安全的)投射,而不是在另一个方向(这不一定是安全的)。

于 2010-08-04T03:16:47.170 回答
2

这是implicit_cast函数模板的一个很好的用例。

于 2010-08-04T03:20:16.383 回答
1

您可以编写自己的演员表:

template<class T>
const T & MakeConst(const T & inValue)
{
    return inValue;
}
于 2010-08-04T08:47:15.843 回答