共有ポインタのコンテナに基づく次のクラスを考えると、
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_に可変オブジェクトを指す必要がありますが、クライアントコード呼び出しで何かを変更できるようにしたくありません。FooBargetFoos()
constリターンタイプから修飾子を削除するFooと、getFoos()これが修正されます。しかし、私は、std::vectorその恒常性をその要素に伝播する一方boost::shared_ptrで、それが指すオブジェクトにはそのようなことを(当然のことながら)行わないことを理解しています。したがって、クライアントコードは、返された共有ポインターが指すオブジェクトを変更できるため、(コンパイラーが文句を言わなくても)修飾子getFoos()を監視しなくなったように見えます。constFoo
私は正しいですか?getFoos()もしそうなら、コピーせずにconstオブジェクトへのconst参照のconstベクトルを返すように書く方法はありますか?