我在这里读到question here关于const-correctness的内容。 Scott Meyer解决方案似乎是一个很好的解决方案,但是如果你有一个使用this
指针的成员函数(需要const和非const版本),那该怎么办呢?如果成员函数为const
,那么this
会自动表示const this
,这可能会使代码的大部分位于单个const
函数中变得困难。
我遇到的一种可能的解决办法就是将对this
的引用作为参数传递给const函数,因此该函数可以使用该引用而不是直接使用this
指针。但是,这样安全吗?它似乎是安全的(如果非常hacky),因为你实际上并没有在const-object上使用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版本的函数时必须复制大量代码的好方法,但这样安全吗?或者是否会以某种方式导致未定义的行为?
答案 0 :(得分:0)
请注意,即使您处于const f1()
函数中并且可以修改“this”,f2()
也会被标记为非const,因此通过调用f2()
对象可能会被修改。仅f1()
不会让你自己(或任何const对象)修改“this”。您甚至无法在f2()
对象的帮助下调用const Foo
,因此这不会带来任何好处。
换句话说 - 在你的例子中,非const f1()
就足够了。您不需要f1() const
或两个版本。
<强>更新强>
现在,您将无法修改从self
调用f1()
的{{1}}“const”版本中的void f1(const
Foo & self) const
。