我在这里问了相关问题.现在它有点微妙.
这是代码:
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解决方案,如果确实有一个好的只是使用标准.
const vector<unique_ptr<MyObject>>& objs = pMyClass->get_const_objs();
unique_ptr<MyObject> p = move(objs[0]);
Run Code Online (Sandbox Code Playgroud)
你做不到,所以你不用担心!
由于objs是const vector<> &,因此该向量的元素也被视为const。因此,你不能“移动”它;你能移动常量对象吗?