注:私はg ++コンパイラを使用しています(これはかなり良いと思いますが、標準にかなり近づくはずです)。Intsの配列への参照を宣言するとき、なぜそれがconstポインタへの参照である必要がありますか?
あなたはint型の配列を宣言しているとしましょう:
int a[3] = { 4, 5, 6 };
さて、あなたは本当にその配列への参照を宣言したいとしましょうBjarne以外の言語がサポートしていると言う(用事なぜ、 )。
ケース1 - あなたがしようとした場合:
int*& ra = a;
その後、コンパイラbalksと言う:
"invalid initialization of non-const reference of type `int*&' from a temporary of type `int*'"
まず第一に、物事、なぜ '' 一時変数(つまりはないです)...
とにかく、非constエラーが表示されたら、私はconstをスローしようとします。
ケース2 - あなたがしようとした場合は:
int*const&rca = a; //wish I knew where the spaces should go (but my other post asking about this sort of protocol got a negative rank while many of the answers got ranked highly -- aha! there are stupid questions!)
その後すべてが、それはクールにコンパイルされ、そしてあなたは、配列への参照を取得します。これはまた、あなたの元の配列への参照を与える
int* justSomeIntPointer = a; //LINE 1
int*& rpa = justSomeIntPointer; //LINE 2
: -
ケース3今ここでは、コンパイルします別のものです。
ここに私の質問です:静的に宣言された配列 の名前はどの時点でconstポインタになりますか? intの配列の名前はintへのポインタでもあることを覚えているようですが、これまでのconstポインタ型から覚えていません...
ケース1のようです宣言された参照(ra)がconstポインタにないため、 'a'が既にconstポインタからintへと始まっていることがあるため、失敗します。
すでに宣言されている参照(rca)がすでにconst-pointer-to-intであるため、ケース2のように見えます。
ケース3もうまく動作しますが、それはなぜですか?想定されるintへのポインター(つまり、配列名 'a')はどの時点でconstポインタになりますか?それをint *(LINE 1)に代入するか、そのint *をint * &(LINE 2)に代入すると起こりますか?
希望はこれが理にかなっています。ありがとう。
ので、一時的な変数は、常にCONSTていますか? – Jimmy
@Jimmy:一時変数は必ずしもconstではありませんが、言語は非const参照に直接バインドすることを禁じています。配列 'a'は一時的ではありませんが、一時的な配列からポインタへの変換の結果として生じるポインタです。 –
スタック上に宣言されているのは、 '自動保存期間があります'という意味です。つまり、そのブロック/オブジェクトが含まれているときに範囲外になります。動的に割り当てられたオブジェクトを手動で管理して、プラスのポイントにすることはほとんどありません。最後に必要なことは、なぜ動的割り当てが優れているかについての別の誤った考えです。これは、非常に明確で異なる意味を持つ用語である_temporary_の誤った定義を呼び出すため、特に悪いことです。 –