根据这个演讲,使用C++11范围基础的for
循环处理Qt容器时存在某些陷阱。请考虑:
QList<MyStruct> list;
for(const MyStruct &item : list)
{
//...
}
根据讲话,陷阱来自于隐式共享。在幕后,基于范围的for
从容器获取迭代器。但由于容器不是const
,因此迭代器将是非const
的,这显然足以使容器分离。
当您控制容器的生命周期时,很容易解决此问题,只需传递指向容器的const
引用即可强制使用const_iterator
而不是分离。
QList<MyStruct> list;
const Qlist<MyStruct> &constList = list;
for(const MyStruct &item : constList)
{
//...
}
但是对于例如将容器作为返回值的情况,该怎么办呢?
Translated:但是对于例如将容器作为返回值的情况,该怎么办呢?
QList<MyStruct> foo() { //... }
void main()
{
for(const MyStruct &item : foo())
{
}
}
这里发生了什么?容器还是被复制了吗?直觉上我会说是为了避免可能需要这样做。
QList<MyStruct> foo() { //... }
main()
{
for(const MyStruct &item : const_cast<const QList<MyStruct>>(foo()))
{
}
}
我不确定。我知道这样说起来有点啰嗦,但是我需要这样做,因为我经常在大容器上使用基于范围的for循环,所以这个讲话对我来说听起来很受用。
到目前为止,我使用一个帮助函数将容器转换为const
引用,但如果有更短/更简单的方法实现相同的效果,我想听听建议。
const MyStruct&const item:foo()
以常量方式进行迭代。 - Dmitry Sazonovfor(const auto& bla : blas)
的问题,我认为这种方式不会有任何问题。 - AngryDuckconst QList<MyStruct> &constList = list;
而不是Qlist<MyStruct> &constList = list;
,以获取 const 迭代器并防止分离。如果不这样做,为什么? - avb