1

const-correctness に関するこの質問をここで読んでいました。thisScott Meyer ソリューションは良い回避策のように思えますが、ポインターを利用するメンバー関数 (const バージョンと非 const バージョンの両方を必要とする) がある場合はどうでしょう。メンバー関数が自動的に であるconst場合、コードの大部分が 存在する単一の関数を持つことが難しくなる可能性があります。thisconst thisconst

私が思いついた回避策の 1 つは、単純に const 関数への参照をパラメーターとして渡すことでした。これにより、関数はポインターthisを直接使用する代わりにその参照を使用できるようになりました。thisしかし、これは安全ですか?const_castconst オブジェクトを実際に使用していないため、(非常にハッキーな場合) 安全であるように思われます。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()、非 const としてマークされているため、f2()オブジェクトを呼び出すことによって変更される可能性があることに注意してください。そして、それf1()だけでは、それ自体 (または任意の const オブジェクト) 内で「this」を変更することはできません。f2()オブジェクトの助けを求めることさえできないconst Fooので、これは何の利益ももたらしません。

言い換えれば、あなたの例では、非 constf1()で十分です。f1() constここでは両方のバージョンは必要ありません。


更新から呼び出されるself「const」バージョンで変更することf1()は できなくなります。void f1(const Foo & self) constvoid f2() const

于 2010-09-25T22:51:11.530 に答える