30

The following program

void display(const int& a)
{
    cout << a ;
}

will work if called with a literal like this

display(5);

but without the const it won't work.

So how can a const reference keep pointing to an R-Value (anonymous variable)?

4

5 に答える 5

37

最後の質問:

const 参照が R 値 (匿名変数) を指し続ける方法

これが答えです。C++ 言語によると、ローカル const 参照は一時値の有効期間を包含スコープの終わりまで延長しますが、コピー構築のコストを節約します (つまり、代わりにローカル変数を使用する場合)。

于 2016-03-19T15:50:26.560 に答える
23

任意のオブジェクトを内部に何らかの値を含むボックスと考えてください。ボックスには名前タグが付いている場合と付いていない場合があります。つまり、名前タグが付いているボックス名前タグが付いていないvariableボックスはです。ネームタグの有無にかかわらず、箱はございます。literal


Referenceボックスにネームタグを追加する方法です。

int a = 5;
int &b = a;

ボックスには2 つの名前タグがあります (値5が入っています)。

const int &c = 5;

ほら、ボックスに名前が付けられました。


以前に名前がなかったボックスの新しい名前は、 としてマークする必要がありますconst。ボックス内の値はその名前で変更できるため、ボックスに発生させたくない(発生させたくない)ためliteralです。

于 2016-03-19T15:13:55.783 に答える
6

リテラルの定義に戻ります。リテラルは定数です。たとえば、数値 5 の値は変化しませんが、5 の値が割り当てられた変数が別の値に変化する可能性があります。参照によってリテラルを渡すことは、関数がそれを変更する可能性があることを意味します。これは、定義上、リテラルに対して実行できないことです。これが、言語で const を使用して変更する必要がある理由です。C++ で試してみてもリテラルを変更できるとは思いませんが、リテラル値を変更できないことをプログラマーに思い出させるために、この規則を強制しています。

于 2016-03-19T14:38:40.540 に答える
2

リテラルは一定だからです。1 は 2 に"abd"なれないし、 にもなれない"edf"

C++ で非const参照によるリテラルの取得が許可されている場合、次のいずれかになります。

  1. リテラルの意味を動的に変更できるようにして、1 を 2 にできるようにする必要があります。
  2. プログラマーは、リテラルを参照しない参照を介してのみ値を変更し、間違った場合は未定義の動作を呼び出すように細心の注意を払う必要があります。

x == 1(1)コンテキストによっては「x は 2 に等しい」という意味になる可能性があるため、プログラムに混乱が生じます。また、(2)void display(int& a)リテラル参照を受け取るかどうかをどのように知る必要があるため、達成することは不可能ですか?

これら 2 つのオプションはどちらも意味がないため、リテラルはconst参照によってのみ渡すことができます。


実際、非推奨となった文字列リテラルから への変換char*は、参照ではなくポインタではありますが、ルールが非常に理にかなっている理由の良い例です。char*を にポイントさせることはできますが"abc"、 の「変更可能性」属性を実際に利用しchar*て要素の 1 つを変更しようとするとchar、未定義の動作が発生します。これにより、非推奨の変換全体が危険で役に立たなくなります (非レガシー コードでは)。

言語の他のすべての部分でそのような問題を抱えたくないでしょう?

于 2016-03-19T14:45:09.853 に答える