C++ 11基于范围的指针向量

Att*_*ila 7 c++ gcc pointers

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

我试图用另一个替换for循环,它是在一个std :: vector of structs上,它编译并运行完美.

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时(是的,我将-std = c ++ 0x作为g ++的一个参数),它会因为这个错误而消失:
main.cpp|27|error: found ‘:’ in nested-name-specifier, expected ‘::’
如果我将27-30行注释掉,那就没问题了.

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

谢谢你的帮助!

Kla*_*aim 17

for ((int*) &p : values)
Run Code Online (Sandbox Code Playgroud)

这是错的.(int*)是一个单独的表达式,所以你需要做int*&(没有括号,这使得一个表达式 - 又名"不是一个类型名称")至少使它正确.我更喜欢使用汽车或汽车和个人.

你可以做 :

for (auto p : values) // here p is a pointer, a copy of each pointer
Run Code Online (Sandbox Code Playgroud)

要么

for (auto& p : values ) // here p is a non-const reference to a pointer
Run Code Online (Sandbox Code Playgroud)

要么

for ( int* p : values ) // here p is a copy of each pointer
Run Code Online (Sandbox Code Playgroud)

或者在通用代码中:

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

  • `for(auto*p:values)`也适用. (2认同)