添加const-ness与static_cast和const_cast的“this”对象之间的C ++区别?

时间:2012-06-20 20:21:28

标签: c++ static-cast const-cast

根据Scott Meyers的说法,为了防止在const版本的getter和非const版本的getter中重复代码,请从非const版本调用该方法的const版本:static_cast<const A&>(*this).Methodology(); < em>然而,由于过度热心的Visual Assist X Intellisense我意外使用我输入了const_cast<const A&>(*this).Methodology();并且它工作得很好。

在这种情况下,使用特定演员阵容有什么区别?

正在使用的IDE:Visual Studio 2010。

2 个答案:

答案 0 :(得分:5)

假设this的类型为A*,则没有区别。

通常const_cast可以抛弃const说明符(来自任何级别的间接或模板参数)

如果目标类型在源的类型层次结构中,

static_cast<>可以将类型转换为另一个类型。

他们不能做彼此的工作。

他们在你的情况下工作的原因是因为你已经引入了 const-ness,而不是把它拿走了(从函数的非const版本调用{{{ 1}}是this,没有const)。你也可以写

A*

它可以在不需要任何铸造的情况下工作。铸造用于方便和简洁,而不必引入新的变量。

注意:您可以在此处使用const A& tmp = *this; tmp.Methodology(); 知道您正在投射到正确的类型。在其他情况下(当您无法确定时),您需要使用执行运行时类型检查的static_cast<>来确保转换有效

答案 1 :(得分:4)

重新阅读Effective C++ 3rd Ed.中的第3项后,我意识到他实际上主张使用两者。添加const来调用const版本,然后抛弃返回值的常量(如果有的话)。在我的特定情况下,没有const返回值,只有一个const函数,所以包裹了const_cast&lt;&gt;不需要版本,实际上导致两个有问题的电话之间无差异

  

(第13页)第3项:尽可能使用 const

     

...

     

(第23页)避免重复 const    const 会员职能

     

...您真正想要做的是实现 operator [] 功能   一次并使用两次。也就是说,你想拥有一个版本    operator [] 调用另一个。这使我们失去了常数。

     

...在返回值上抛弃 const 是安全的,在这种情况下,   因为无论谁调用非 const运算符[] 都必须有一个   首先是非 const 对象....所以拥有非 const   operator [] 调用 const 版本是避免代码的安全方法   重复,即使它需要演员...

class TextBlock {
public:

...

    const char& operator[](std::size_t position) const      //same as before
    {
        ...
        ...
        ...
        return text[position];
    }

    char& operator[](std::size_t position)        //now just calls const op[]
    {
        //cast away const on op[]'s return type;
        //add const to *this's type;
        //call const version of op[].
        return const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);
    }
...
};
     

如您所见,代码有两个强制转换,而不是一个。我们想要的   非 const运算符[] ...为了避免无限递归,我们必须这样做   指定我们要调用 const运算符[] ,但是没有   直接的方式来做到这一点。相反,我们从其原生类型转换* this    TextBlock&amp; const TextBlock&amp; 。是的,我们使用强制转换来添加   常量的!所以我们有两个演员:一个将 const 添加到* this (这样我们对 operator [] 的调用将调用 const 版本),第二个   从* const运算符[]的返回值中删除 const