2011-01-03 14 views
3
#include<iostream> 
using namespace std; 

const int vals[] = {0, 1, 2, 3, 4}; 

int newArray[ vals[2] ]; //"error: array bound is not an integer constant" 

int main(){ 
    return vals[2]; 
} 

//returns 2 if erroneous line is removed 

なぜこれは機能しませんか?配列サイズを別の配列値から初期化する

答えて

5

C++コンパイラは、コンパイル時に既知のサイズの配列のみを割り当てることができます。可変サイズのメモリを割り当てたい場合は、new演算子を使用します。

+7

またはより良いと思うかもしれないように、その定数ではありません。 –

+1

私には他の質問への回答のように見えます –

9

vals[2]は定数式ではありませんので、残念ながら標準C++ではこれを行うことはできません!今後の標準では、簡単にコンパイル時に評価を依頼するconstexpr(G ++ 4.6で実装)を持っているでしょう:

#include<iostream> 
using namespace std; 

constexpr int vals[] = {0, 1, 2, 3, 4}; 

int newArray[ vals[2] ]; // vals[2] is a constant expression now! 

int main(){ 
    return vals[2]; 
} 
5

それはconst式の値がさえコンパイル時に知られていない可能性があります。たとえば、あなたが何かに定数を初期化することができ

const int size = rand(); // random size 

のように、関数から返されたので、それはあなたがのstd :: vector` `、まだ