【问题标题】:C++11 range-based for on a vector of pointers基于指针向量的 C++11 范围
【发布时间】:2011-08-08 03:35:40
【问题描述】:

我刚刚编译了 GCC 4.6.0,我想尝试一下新功能,从基于范围的 for 循环开始。
我想改变的第一个循环是在指针的 std::vector 上迭代。我更改了代码以使用新语法,但它没有编译。

我尝试替换另一个 for 循环,它位于结构的 std::vector 上,它编译并完美运行。

这是一个简短的测试代码,向您展示我的问题:

#include <vector>
#include <iostream>

int main()
{
    std::vector< int > values;
    
    values.push_back(2);
    values.push_back(5);
    values.push_back(8);
    values.push_back(13);
    values.push_back(17);
    
    for (int &n : values)
    {
        std::cout << n << "\n";
    }
    
    std::vector< int* > pointers;
    
    pointers.push_back(new int(2));
    pointers.push_back(new int(5));
    pointers.push_back(new int(8));
    pointers.push_back(new int(13));
    pointers.push_back(new int(17));
    
    for ((int*) &p : values)
    {
        std::cout << (*p) << "\n";
    }
    
    for( unsigned int i = 0; i < pointers.size(); ++i)
    {
        delete pointers[i];
    }
    
    return 0;
}

当我尝试编译它时(是的,我将 -std=c++0x 作为 g++ 的参数),它会因以下错误而死:

main.cpp|27|错误:在嵌套名称说明符中找到“:”,应为“::”

如果我将第 27-30 行注释掉,就可以了。

我做错了什么?指针引用声明语法不对吗?
或者是否存在可以使用基于范围的 for 循环的包含类型的限制?

【问题讨论】:

  • 应该可以移到 SO
  • @Doug:同意...如果问题包含源代码而不是一个很小的 ​​URL,这也会有所帮助。

标签: c++ pointers gcc


【解决方案1】:
for ((int*) &p : values)

这是错误的。 (int*) 是一个单独的表达式,所以你需要做 int*&amp; (没有括号,这就是一个表达式 - 也就是“不是类型名称”)至少要使它正确。我个人更喜欢使用 auto 或 auto&。

你可以这样做:

for (auto p : values) // here p is a pointer, a copy of each pointer

for (auto& p : values ) // here p is a non-const reference to a pointer

for ( int* p : values ) // here p is a copy of each pointer

或在通用代码中:

for ( auto&& p: values ) // p is either a const reference to what is in values, or a non-const reference, depends on the context

【讨论】:

  • 所以在这种情况下auto - 在std::vector&lt;int*&gt; 上 - 将产生int*,而auto&amp; 将产生int*&amp;。说得通。为什么你会想要int*&amp;?哦,我猜前者实际上是在复制内存,而后者不是?
  • @Andrew 视情况而定,也许有时你想确保你得到的类型是你想要的,或者你想以某种方式暗示转换。 auto 在这里是一个很好的默认值,但是有了一个概念,它会稍微好一些(C++20):for( std::integral auto* p : values) 使您获得指向似乎是一个整体的指针。
【解决方案2】:

我认为您的意思是迭代“指针”而不是“值”...

【讨论】:

  • 可惜只能接受一个答案。你也是对的,我写值而不是指针是愚蠢的,但克莱姆的评论更详细,并用括号显示了错误。无论如何,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
相关资源
最近更新 更多