共有ポインタのコンテナに基づく次のクラスを考えると、
class Foo;
class Bar {
public:
// ...
const std::vector<boost::shared_ptr<const Foo> >& getFoos() const { return foos_; }
private:
std::vector<boost::shared_ptr<Foo> > foos_;
};
コンパイルされません
invalid initialization of reference of type ‘const std::vector<boost::shared_ptr<const Foo>, std::allocator<boost::shared_ptr<const Foo> > >&’ from expression of type ‘const std::vector<boost::shared_ptr<Foo>, std::allocator<boost::shared_ptr<Foo> > >’
メンバーは、オブジェクトが内部で使用するためfoos_
に可変オブジェクトを指す必要がありますが、クライアントコード呼び出しで何かを変更できるようにしたくありません。Foo
Bar
getFoos()
const
リターンタイプから修飾子を削除するFoo
と、getFoos()
これが修正されます。しかし、私は、std::vector
その恒常性をその要素に伝播する一方boost::shared_ptr
で、それが指すオブジェクトにはそのようなことを(当然のことながら)行わないことを理解しています。したがって、クライアントコードは、返された共有ポインターが指すオブジェクトを変更できるため、(コンパイラーが文句を言わなくても)修飾子getFoos()
を監視しなくなったように見えます。const
Foo
私は正しいですか?getFoos()
もしそうなら、コピーせずにconstオブジェクトへのconst参照のconstベクトルを返すように書く方法はありますか?