C ++加入常量性与的static_cast和const_cast会之间差“这个”对象?(C++ d

2019-07-30 01:22发布

按照斯科特迈尔斯,以防止码重复中的吸气剂和吸气剂的非const版本的const版本,从非const版本调用该方法的const版本: static_cast<const A&>(*this).Methodology(); 然而 ,在偶然使用由于一个过激的视觉辅助X智能感知我输入: const_cast<const A&>(*this).Methodology(); 和它的工作就好了。

什么是任何在这种情况下,使用一个特定的投所有的差异?

IDE使用:Visual Studio 2010中。

Answer 1:

假设类型thisA* ,没有任何区别。

在一般const_cast可以投赠品的const说明符(从间接或模板参数的任何电平)

static_cast<>可以投一个类型到另一个如果目标类型是在源的类型的层次结构。

他们不能做对方的工作。

他们都在你的情况下,工作的原因是因为你已经引入了常量性,而不是已经采取它拿走(从非const版本的函数调用的类型, thisA* ,没有常)。 你也可以同样采写

const A& tmp = *this;
tmp.Methodology();

一下子就不需要任何铸造工作过。 铸造是为了方便和简洁到没有引入新的变量。

注意 :您可以使用static_cast<>在这里,你知道 ,你是铸造到正确的类型。 在其他情况下(当你不能确定),你需要使用dynamic_cast<>做了运行时类型检查,以确保转换是有效的



Answer 2:

之后重新阅读项目3从Effective C++ 3rd Ed. 我意识到他实际上使用这两种主张。 添加常量调用const版本,然后抛弃的返回值的常量性(如果有的话)。 在我的具体情况,也没有常返回值,所以不需要包裹逐的const_cast <>版本只是一个常量,功能和效应导致那里是有问题的两个电话之间没有区别

(第13) 物品3:使用 常量 尽可能

...

(第23页) 中的 常量 const 成员函数 避免重复

......你真的想要做的是,一旦实现operator []功能,并使用它两次。 也就是说,你希望有运营商的一个版本[]拨打另一个。 这给我们带来了虚掷常量性。

...铸造外出返回值的常量是安全的,在这种情况下,因为无论谁被称为非const的operator []的必须有在首位非const对象....所以具有非常量操作[]调用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的operator []的 ......为了避免无限递归,我们必须指定我们要调用const operator []的 ,但有没有直接的方法来做到这一点。 取而代之的是,我们投* 从它的原生型的TextBlockconst TextBlock的和 。 是的,我们使用CAST 增加常量 ! 因此,我们有两个强制转换:一次加一个const,以* (让我们的运营商的呼叫[]会调用const版本),第二除去从* const的运营商[]的返回值的常量



文章来源: C++ difference between adding const-ness with static_cast and const_cast of “this” object?