按照斯科特迈尔斯,以防止码重复中的吸气剂和吸气剂的非const版本的const版本,从非const版本调用该方法的const版本: static_cast<const A&>(*this).Methodology();
然而 ,在偶然使用由于一个过激的视觉辅助X智能感知我输入: const_cast<const A&>(*this).Methodology();
和它的工作就好了。
什么是任何在这种情况下,使用一个特定的投所有的差异?
IDE使用:Visual Studio 2010中。
假设类型this
是A*
,没有任何区别。
在一般const_cast
可以投赠品的const
说明符(从间接或模板参数的任何电平)
static_cast<>
可以投一个类型到另一个如果目标类型是在源的类型的层次结构。
他们不能做对方的工作。
他们都在你的情况下,工作的原因是因为你已经引入了常量性,而不是已经采取它拿走(从非const版本的函数调用的类型, this
是A*
,没有常)。 你也可以同样采写
const A& tmp = *this;
tmp.Methodology();
一下子就不需要任何铸造工作过。 铸造是为了方便和简洁到没有引入新的变量。
注意 :您可以使用static_cast<>
在这里,你知道 ,你是铸造到正确的类型。 在其他情况下(当你不能确定),你需要使用dynamic_cast<>
做了运行时类型检查,以确保转换是有效的
之后重新阅读项目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 []的 ,但有没有直接的方法来做到这一点。 取而代之的是,我们投* 这从它的原生型的TextBlock的和为const TextBlock的和 。 是的,我们使用CAST 增加常量 ! 因此,我们有两个强制转换:一次加一个const,以* 这 (让我们的运营商的呼叫[]会调用const版本),第二除去从* const的运营商[]的返回值的常量 。
文章来源: C++ difference between adding const-ness with static_cast and const_cast of “this” object?