1

我在这里阅读了这个关于const 正确性的问题。thisScott Meyer 解决方案似乎是一个很好的解决方法,但是如果您有一个使用指针的成员函数(需要 const 和非 const 版本)怎么办。如果成员函数是const然后this自动表示,这会使在大部分代码所在的地方 const this很难有一个函数。const

我想到的一种可能的解决方法是简单地this将对 const 函数的引用作为参数传递,因此该函数可以使用该引用而不是直接使用this指针。但是,这样安全吗?它似乎是安全的(如果非常 hacky),因为您实际上并没有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 版本时复制大量代码,但这安全吗?或者它会以某种方式导致未定义的行为?

4

1 回答 1

0

请注意,即使您在 constf1()函数中并且可以修改“this”,f2()也被标记为非常量,因此通过调用f2()对象可能会被修改。并且f1()单独不会让您在其自身(或任何 const 对象)中修改“this”。你甚至不能求助于f2()对象const Foo,所以这不会带来任何好处。

换句话说-在您的示例中,非常量f1()就足够了。您不需要f1() const或两个版本都在这里。


更新现在 您将无法self修改从.f1()void f1(const Foo & self) constvoid f2() const

于 2010-09-25T22:51:11.530 回答