回答:
定数に値を割り当てるために非定数変数を使用しています。したがって、その変数の値はコンパイル時間を決定できません。私はあなたが変わっていないことを知っていますaが、コンパイラはこのように考えていません。
「const」は、変数が実行時に変更されないことを意味するだけであり、コンパイル時にその値を推定できることを意味するものではありません。
あなたが探しているのは「constexpr」だと思います。多分あなたはこのようにそれを試すことができます:
constexpr int b = 4; // can't be assigned from a!
int d[b];
代わりに、「constexpr」は「実際のconst」を意味し、「const」は歴史的な理由により「変更しないvar」のみを意味します。@Bathshebaが言ったように、c ++のネイティブ配列は常に固定長であることに注意する必要があります。
「定数」という用語は本当にあいまいで、キーワードは constは誤解を招くものです。
constつまり、「初期化後にこのオブジェクトの値が変更されないようにする」ことです。それはしません「コンパイル時定数」。その初期値は、ランタイムソースから取得することができます(通常、そうします)。
バインドされた配列にはコンパイル時の定数が必要です。
fooコンパイル時の定数であるオブジェクトが、リテラルやモノなどの定数式から初期化されている場合はconst 、それが名前付きのオブジェクトである可能性がありますconstexpr。それはc; の場合です。それはそうではありませんb。