我刚刚编译了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/