定数を使用して配列の長さを定義できるので、なぜint d [b]が機能しないのですか?


11
int a = 5;
const int b = a, c = 4;

int e[a];
int d[b];
int f[c];

の定義f[c]は有効です。
変数bも定数intですが、コンパイラーは行に対して「式は定数値でなければなりません」というエラーを出しましたint d[b]。違いは何ですかbとはc

回答:


16

bとcの違いは何ですか?

cにはコンパイル時定数の初期化子がありますが、bにはありません。コンパイル時定数の初期化子を持つconstオブジェクトは、それ自体がコンパイル時定数の値です。

定数を使用して長さの範囲を定義できるので、なぜこれが機能しないのですか?

定数だけで十分ではありません。const修飾子は実行時の一貫性を意味します(つまり、値は実行時に決定される可能性がありますが、オブジェクトの存続期間を通じて変更されません)。配列サイズとして使用できるのは、コンパイル時の定数値のみです。


6

定数に値を割り当てるために非定数変数を使用しています。したがって、その変数の値はコンパイル時間を決定できません。私はあなたが変わっていないことを知っていますaが、コンパイラはこのように考えていません。


4

コンパイラの診断は、コンパイル時に評価可能な定数式でなければなりません。

先の元のオブジェクトので、b割り当てられるではないconstb可変長配列は、標準C ++でサポートされていないようにコンパイルは失敗するので、コンパイル時に評価可能な定数式ではありません。


1

「const」は、変数が実行時に変更されないことを意味するだけであり、コンパイル時にその値を推定できることを意味するものではありません。

あなたが探しているのは「constexpr」だと思います。多分あなたはこのようにそれを試すことができます:

constexpr int b = 4; // can't be assigned from a!
int d[b];

代わりに、「constexpr」は「実際のconst」を意味し、「const」は歴史的な理由により「変更しないvar」のみを意味します。@Bathshebaが言ったように、c ++のネイティブ配列は常に固定長であることに注意する必要があります。


どのような「他の言語」について話しているのですか?
ブライアン、

1
@ブライアン申し訳ありませんが、それは関係ありません。答えを変えた。
レオン

「本当のスコットランド人ではありません...」- 「constexpr」に同意しないでください。代わりに「実際のconst」を意味し、「const」は「変化しないvar」ステートメントのみを意味します。「const」は「const」を意味し、「constexpr」は「constexpr」を意味します。これらは、C ++言語のコンテキストで2つの異なる意味と意味を持っています。「const」は「オブジェクトを変更できない」を意味し、「constexpr」は「コンパイル時に関数または変数の値を評価できる
CharonX

申し訳ありませんが、多分私はそれを間違って表現しました。英語は私の母国語ではありません。
Leon、

1

「定数」という用語は本当にあいまいで、キーワードは constは誤解を招くものです。

constつまり、「初期化後にこのオブジェクトの値が変更されないようにする」ことです。それはしませ「コンパイル時定数」。その初期値は、ランタイムソースから取得することができます(通常、そうします)。

バインドされた配列にはコンパイル時の定数が必要です。

fooコンパイル時の定数であるオブジェクトが、リテラルやモノなどの定数式から初期化されている場合はconst それが名前付きのオブジェクトである可能性がありますconstexpr。それはc; の場合です。それはそうではありませんb

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.