重新学习c++主要是为了了解c++11的一些特性。
下面的代码:
void foo( int arr[])
{
for(auto t : arr)
std::cout << t << " ";
std::cout << std::endl;
}
编译器无法通过的原因是:
范围for的索引其实是在编译的时候确定的,而形参数组传递进来的只是一个指针,在编译的时候,编译器无法确定数组的大小等信息,所以无法通过。
同理,下面的代码:
void foo(int arr[])
{
for(auto iter = begin(arr); iter != end(arr); iter++)
std::cout << *iter << " ";
std::cout << std::endl;
}
可以从begin()和end()的定义中看出
template<class _Ty,
size_t _Size> inline
_Ty *begin(_Ty (&_Array)[_Size])
{ // get beginning of array
return (_Array);
}
template<class _Ty,
size_t _Size> inline
_Ty *end(_Ty (&_Array)[_Size])
{ // get end of array
return (_Array + _Size);
}
这两个函数是在编译器件确定数组的大小的。