2015-06-30 64 views
2
#include <bits/stdc++.h> 
using namespace std; 

int main(){ 
    ios::sync_with_stdio(0); cin.tie(0); 
    auto arr = new int[5]; 
    // int arr[5] = {1, 2, 3, 4, 5}; 
    for (auto i: arr){ 
     cout << i << ' '; 
    } 
} 

爲什麼不能正常工作? 我收到編譯時錯誤說這個。C++ for-每個循環在堆上分配數組

C.cpp: In function 'int main()': 
C.cpp:8:15: error: 'begin' was not declared in this scope 
    for (auto i: arr){ 
      ^
C.cpp:8:15: note: suggested alternatives: 
In file included from /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/x86_64-pc-cygwin/bits/stdc++.h:94:0, 
       from C.cpp:1: 
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/valarray:1206:5: note: 'std::begin' 
    begin(const valarray<_Tp>& __va) 
    ^
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/valarray:1206:5: note: 'std::begin' 
C.cpp:8:15: error: 'end' was not declared in this scope 
    for (auto i: arr){ 
      ^
C.cpp:8:15: note: suggested alternatives: 
In file included from /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/x86_64-pc-cygwin/bits/stdc++.h:94:0, 
       from C.cpp:1: 
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/valarray:1226:5: note: 'std::end' 
    end(const valarray<_Tp>& __va) 
    ^
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/valarray:1226:5: note: 'std::end' 

當我以註釋的方式初始化數組時,它工作正常。 (明顯) 所以,我覺得問題是用新的運算符。但我不明白它是什麼。

+0

因爲'arr'是一個'int *',而不是一個數組。在你註釋掉的代碼中,'arr'是一個數組,而不是指針。 [數組不是指針!](https://stackoverflow.com/q/4810664/241631) – Praetorian

+0

對於動態分配的數組,情況當然有'std :: array'。 – PeterSW

回答

8

new int[5]分配5個元素的數組並返回指向第一個元素的指針。返回的類型是rvalue int*

int foo[5]是一個包含5個元素的數組。 foo的類型是lvalue int [5]

循環的範圍要求它知道它正在迭代的對象的大小。它可以迭代數組,但不能迭代指針。考慮下面的代碼,

int foo[4]; 
for (int a : (int *)foo) {} 

GCC 5.0也產生一個錯誤「錯誤:‘開始’未在此範圍中聲明」,因爲陣列衰變成一個指針。