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

Cas*_*sey 14 c++ const-cast static-cast

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

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

正在使用的IDE:Visual Studio 2010.

Cas*_*sey 6

重新阅读第3项之后,从Effective C++ 3rd Ed.我认识他是实际使用崇尚两种。添加 const 来调用 const 版本,然后抛弃返回值的常量性(如果有的话)。在我的特定情况下,没有 const 返回值,只有一个 const 函数,因此不需要包装的 const_cast<> 版本,实际上导致所讨论的两个调用之间没有区别

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

...

(p. 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]);
    }
...
};
Run Code Online (Sandbox Code Playgroud)

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


Att*_*ila 5

假设类型thisA*,没有区别.

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

static_cast<> 如果目标类型在源的类型层次结构中,则可以将类型转换为另一个类型.

他们不能做彼此的工作.

它们在你的情况下工作的原因是因为你引入了 const-ness,而不是把它带走(从函数的非const版本调用thisis 的类型A*,没有const).你也可以写

const A& tmp = *this;
tmp.Methodology();
Run Code Online (Sandbox Code Playgroud)

并且它可以在不需要任何铸造的情况下工作.为了方便和简洁而使用铸件而不必引入新的变量.

注意:您可以static_cast<>在此使用,因为您知道您正在使用正确的类型.在其他情况下(当您无法确定时)您需要使用dynamic_cast<>它执行运行时类型检查以确保转换有效

  • @Casey - 如果你在`const`成员函数中,`this`的类型是`const A*`(更确切地说是`const A*const`),否则它是`A*`(更准确地说是`A*const `) (2认同)