我正在读这个question here这里关于常量正确性。 Scott Meyer 解决方案似乎是一个很好的变通方法,但是如果您有一个使用 this
指针的成员函数(需要 const 和非 const 版本)怎么办。如果成员函数是 const
,那么 this
自动意味着 const this
,这使得很难有一个单一的 const
大部分代码所在的函数。
我想到的一个可能的解决方法是将对 this
的引用作为参数传递给 const 函数,这样函数就可以使用该引用而不是直接使用 这个
指针。但是,这样安全吗?它似乎是安全的(如果非常 hacky),因为您实际上并没有在 const 对象上使用 const_cast
。相反,您只是通过将对象的非 const 引用传递给 const
成员函数来绕过它提供的契约。
例如:
class Foo
{
private:
template <class SelfReference>
void f1(SelfReference& self) const
{
// We now might have a non-const reference to "this", even though
// we're in a const member function. But is this safe???
}
public:
void f2()
{
f1(*this);
}
void f2() const
{
f1(*this);
}
};
这似乎提供了一种很好的方法来避免在需要函数的 const 和非 const 版本时必须复制大量代码,但这安全吗?或者它是否会以某种方式导致未定义的行为?
最佳答案
请注意,即使您在 const f1()
函数中并且您可以修改“this”,f2()
也被标记为非常量,因此通过调用f2()
对象可能会被修改。单独使用 f1()
不会让您修改其自身(或任何 const 对象)中的“this”。您甚至不能调用 f2()
来帮助 const Foo
对象,所以这不会带来任何好处。
换句话说 - 在您的示例中非常量 f1()
就足够了。您不需要 f1() const
或此处的两个版本。
更新
现在您将无法在 f1()
的“const”版本中修改 self
,即 void f1(const
Foo & self) const
从 void f2() const
调用。
关于c++ - 避免代码重复(常量正确性)redux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3795847/