const-correctness に関するこの質問をここで読んでいました。this
Scott Meyer ソリューションは良い回避策のように思えますが、ポインターを利用するメンバー関数 (const バージョンと非 const バージョンの両方を必要とする) がある場合はどうでしょう。メンバー関数が自動的に であるconst
場合、コードの大部分が 存在する単一の関数を持つことが難しくなる可能性があります。this
const this
const
私が思いついた回避策の 1 つは、単純に const 関数への参照をパラメーターとして渡すことでした。これにより、関数はポインターthis
を直接使用する代わりにその参照を使用できるようになりました。this
しかし、これは安全ですか?const_cast
const オブジェクトを実際に使用していないため、(非常にハッキーな場合) 安全であるように思われます。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 バージョンの関数が必要な場合に、大量のコードを複製する必要がないように思われますが、これは安全ですか? それとも、どういうわけか未定義の動作を引き起こしますか?