如何确保返回向量<unique_ptr>的常量

my_*_*ion 5 c++ c++11

在这里问了相关问题.现在它有点微妙.

这是代码:

class MyClass {
  public:
    const vector<unique_ptr<MyObject> >& get_const_objs() const;

  private:
    vector<unique_ptr<MyObject>> m_objs;
};
Run Code Online (Sandbox Code Playgroud)

我的意图是来自get_const_objs()的返回向量是只读的,但问题是因为向量的元素不是const,所以调用者仍然可以更改单个元素,例如

const vector<unique_ptr<MyObject>>& objs = pMyClass->get_const_objs();
unique_ptr<MyObject> p = move(objs[0]);
Run Code Online (Sandbox Code Playgroud)

我的解决方案是将const插入向量:

const vector<const unique_ptr<MyObject> >& get_const_objs() const;
Run Code Online (Sandbox Code Playgroud)

但是这导致了一个无聊的get_const_objs()实现,我将每个元素复制到一个新的向量:

const vector<const unique_ptr<MyObjects>>& MyClass::get_const_objs() const
{
  vector<const unique_ptr<MyObjects>> ret;
  for (const auto &obj : my_objs) {
    ret.push_back(obj);
  }
  return ret;
}
Run Code Online (Sandbox Code Playgroud)

是的,我可以在MyClass中添加迭代器接口.还有其他解决方案吗?

我有一个限制:BOOST不可用.但我喜欢知道BOOST解决方案,如果确实有一个好的只是使用标准.

ikh*_*ikh 1

const vector<unique_ptr<MyObject>>& objs = pMyClass->get_const_objs();
unique_ptr<MyObject> p = move(objs[0]);
Run Code Online (Sandbox Code Playgroud)

你做不到,所以你不用担心!

由于objsconst vector<> &,因此该向量的元素也被视为const。因此,你不能“移动”它;你能移动常量对象吗?