構造体の初期化はs
実行時に発生する可能性があります。ただし、配列のサイズはコンパイル時に認識されている必要があります。コンパイラーはs.i
、コンパイル時にの値が既知であることを(確かに)認識しないため、使用すべきでないものに変数を使用していることを認識します。問題は恒常性ではなく、配列のサイズがいつ必要になるかという問題です。
const
あなたは何を意味するのか誤解しているかもしれません。これは、変数が初期化された後、変更されないことを意味するだけです。たとえば、これは合法です。
void func(int x){
const int i = x*5; //can't be known at compile-time, but still const
//int array[i]; //<-- this would be illegal even though i is const
}
int main(){
int i;
std::cin >> i;
func(i);
return 0;
}
この制限を回避するために、C ++ 11ではconstexpr
、コンパイル時に値を決定できることを示すようにマークを付けることができます。これはあなたが望むもののようです。
struct S
{
int const i;
};
int main(){
constexpr S const s = { 42 };
char arr[s.i];
return 0;
}
コンパイル:
$ c++ -std=c++11 -pedantic file.cpp
C99では、実行していることは合法であり、コンパイル時に配列のサイズを知る必要はありません。
struct S
{
int const i;
};
int main(){
struct S const s = { 42 };
char arr[s.i];
return 0;
}
コンパイル:
$ cc -std=c99 -pedantic file.c