在C++底漆中指出
在C++中,指针和数组紧密地交织在一起。特别是,正如我们将看到的那样,当我们使用数组时,编译器通常会将数组转换为指针。
我想用迭代器打印数组。下面的程序运行良好,但是当我试图打印arr2或arr3时,如果我没有弄错,这是int *类型,我会得到一个错误(判断&操作符意味着下面的引用)。
error: no matching function for call to ‘begin(int*&)’
int main(int argc, char** argv) {
int arr[] = {0,1,2,3,4,5,6,7,8,9};
auto arr2 = arr;
auto arr3(arr); // I think arr2 and arr3 are of same type
for(auto it = std::begin(arr) ; it != std::end(arr) ; ++it)
std::cout << *it << " ";
std::cout << std::endl;
return 0;
}考虑到这个语句,如果一个数组被编译器转换成一个指针,那么这个程序如何使用std::begin()和std::end()打印std::begin()和std::end()的内容,如果它们都是指向整数的指针,那么arr2或arr3就不起作用了?
编辑
如果我不能说清楚的话我很抱歉。我希望我能通过编辑来澄清这个问题。
现在我已经知道begin()和end()不能处理指针了(感谢答案),我不知道引用的文本是否为真,因为它指定存在数组->指针转换。如果文本所说的是正确的,那么arr的类型应该是一个指针。在这一点上,引用的文本是否有问题?
另外,我是否可以使用begin()和end()对指针(而不是STL容器)指定大小,可能使用以下构造函数?
template< class T, size_t N >
T* begin( T (&array)[N] );发布于 2014-05-08 13:43:21
在这里,auto将将arr (数组类型)衰减为指针。std:开始和std::结束都只能用于容器或数组,而不能用于指针。
来自C++11标准
§7.1.6.4自动说明符 dcl.spec.auto 1自动类型说明符表示,被声明的变量的类型应从其初始化器中推导出来,或者函数声明器应包括尾随-返回类型。
代码不能在这里工作,因为auto不能推断数组类型。就像:
char a[5];
auto b[5] = a; // error, a evaluates to a pointer, which does
// not match the array type要使其工作,只需使用C++容器(如std::vector )
vector<int> arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };https://stackoverflow.com/questions/23543300
复制相似问题