2

我正在使用 Visual Studio 2010。我想使用的一项功能是 VS2010 中未包含但包含在 VS2012 中的功能是基于范围的 for 循环。

在 VS2012 中,您可以做整洁且超级整洁的 for 循环,例如:

for( auto& it: myElements )
    it->something();

到目前为止,我能在 VS2010 中得到的最接近的是这种语法:

for( auto it = myElements.begin(), end = myElements.end(); it != end; it++ )
    it->something();

在阅读了一些相关问题后,我发现使用 boost\foreach 我可以访问以下宏:

BOOST_FOREACH( auto it, myElements ){
    it.something();
}

我对这种方法的问题是它提供了一个副本(或类似的东西),而不是一个指针。这是我感到困惑的地方。foreach 参考说明如下:

它不进行动态分配,不进行虚函数调用或通过函数指针进行调用,并且不进行对编译器优化器不透明的调用。

这是什么意思?不是副本吗?

如何从 BOOST_FOREACH 获取指针?或者我应该使用其他一些增强功能?

我在这里的其他问题中看到了这种语法:

BOOST_FOREACH( auto& it, myElements ){
    it->something();
}

但是,这不会为我编译并在编辑器中引发错误。这有什么问题?为什么我在这里发现它是许多其他问题的有效代码?

VS2010 中是否有针对基于范围的 for 循环的漂亮整洁的解决方案?(包括使用升压)

4

2 回答 2

2

主要问题是,你有一个指针容器吗?即使在 VS2012 中,也for(auto& it: myElements) it->something();仅适用于(智能)指针的容器。&告诉你这是it一个引用,而->告诉你它是一个指针。这并不矛盾。您可以引用指针。

但是你为什么还要一个指针呢?引用更为惯用。

于 2013-02-11T08:36:15.340 回答
1

这是错误的:

在 VS2012 中,您可以做整洁且超级整洁的 for 循环,例如:

for( auto& it: myElements )
    it->something();

基于范围的循环返回对对象的引用:

for(auto& element: myElements)
    element.something();

编辑

如果存储在容器中的对象是指针,或者是重载类的对象operator*,例如智能指针,则第一种语法将是有效的。

于 2013-02-11T08:35:44.220 回答