是否可以使用类似QMap< QString, boost::multi_index_container<...> >
的构造?
一方面,我们有private:
BOOST_COPYABLE_AND_MOVABLE(multi_index_container)
容器声明中。它应该告诉我们不要放置multi_index_container<>放入其他类似stl的容器中。
另一方面,这种结构
QMap< QString, boost::multi_index_container<...> > _map;
map.insert("bla-bla", container1);
...
auto tmp = _map.value(QString("bla-bla")).get<keyVal>();
//keyVal corresponds to one for the multi_index_container instance
使用Visual Studio 2012编译得很好(+update4+boost v1.55+qt v4.8.5)。
实验发现:
auto tmp = _map.value(QString("bla-bla")).get<keyVal>();
使得CCD_ 3处理已删除的数据。而
auto tmp = _map.value(QString("bla-bla"));
auto tmp_1 = tmp.get<keyVal>();
留下具有有效数据的CCD_ 4。
有人知道如果我们需要把boost::multi_index_container<>
放在另一个容器里,什么是正确的处理方法吗?
Qt5.3有什么不同吗?
如您在QMap:的文档中所见
const T QMap::value(const Key & key, const T & defaultValue = T()) const
该值是通过值返回的,而不是通过引用返回的。除了对大值(例如多索引容器,可能是?)非常低效之外,它还返回一个临时值。
现在,get<keyVal>();
确实返回了对第一个索引的引用,但它是属于临时索引的索引,临时索引在包含完整表达式的末尾终止。
要获得可修改的参考,请使用
T & QMap::operator[](const Key & key)
现在您可以:
auto& tmp = _map[QString("bla-bla")].get<keyVal>();
请注意&
。
添加到@see关于如何检索引用而不是临时值的答案中,boost::multi_index_container
是可复制和可移动的。您引用的这个BOOST_COPYABLE_AND_MOVABLE
宏必须放在类私有部分(如此处所指定),但这不会影响复制/移动actor的可见性。这个故事的寓意是:在深入研究代码之前先咨询文档。
在我的特殊情况下,问题是编译器使用const T operator[](const Key & key) const
而不是T & operator[](const Key & key)
,因为类的方法是const
方法,映射是类的字段。