根据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。
答案 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 。