我刚刚编译了GCC 4.6.0,我想尝试新功能,从基于范围的for循环开始。
我要更改的第一个循环是在指针的std::vector上进行迭代。我更改了代码以使用新语法,但未编译。
我尝试用另一个替代循环,该循环位于结构的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++的参数),它死于此错误:

如果我将第27-30行注释掉,那就可以了。
我究竟做错了什么?指针引用声明语法不正确吗?
还是可以在基于范围的for循环中使用包含类型的限制?

最佳答案

for ((int*) &p : values)

这是错误的。 (int*)仅是一个表达式,因此至少需要使int*&(不带括号,使它成为表达式-aka“不是类型名”)。我更喜欢个人使用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

关于基于C++ 11范围的指针 vector ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5707869/

10-12 16:00