web-dev-qa-db-ja.com

Array [n] vs Array [10]-変数と実数による配列の初期化

コードに次の問題があります。

int n = 10;
double tenorData[n]   =   {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

次のエラーを返します。

error: variable-sized object 'tenorData' may not be initialized

double tenorData[10]を使用すると機能します。

誰もがその理由を知っていますか?

69
msmf14

C++では、可変長配列は無効です。 G ++では(Cで許可されているため)これを「拡張」として許可しているため、G ++では(C++標準に従うことについて-pedanticでなくても)、次のことができます。

int n = 10;
double a[n]; // Legal in g++ (with extensions), illegal in proper C++

「可変長配列」(適切な可変長配列が許可されていないため、C++では「動的サイズ配列」と呼ばれる)が必要な場合、メモリを動的に割り当てる必要があります。

int n = 10;
double* a = new double[n]; // Don't forget to delete [] a; when you're done!

または、さらに良いことに、標準のコンテナを使用します。

int n = 10;
std::vector<double> a(n); // Don't forget to #include <vector>

それでも適切な配列が必要な場合は、作成時に変数ではなく定数を使用できます。

const int n = 10;
double a[n]; // now valid, since n isn't a variable (it's a compile time constant)

同様に、C++ 11の関数からサイズを取得する場合は、constexprを使用できます。

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression
159
Cornstalks