違いは何ですか:
const double& pi = 3.14;
および (アンパサンドなし):
const double pi = 3.14;
どちらも同じ L と R の値を持っているようですが、違いは何ですか?
あなたの特定の例では、違いはありません。
つまり、それらを区別する方法はまったくありません。
ただし、最初は一時への参照をバインドするため、型がクラス型の場合、一時は関数によって生成されるなどの派生クラスにすることができます! そして、スコープの最後でデストラクタが適切に呼び出されます。この小さな el neato トリックは ScopeGuard の実装で使用されます ( Petru Marginean と Andrei Alexandrescu によるDDJ の元の ScopeGuard 記事を参照してください- Petru は ScopeGuard を発明し、Andrei はその上でより一般的なものを作成しました)。
以前、C++ 言語を作成した Bjarne Stroustrup に、最初の宣言の構文がサポートされている理由を尋ねたことがあります。
そして彼の返答は、主に統一された規則を持つことである (つまり、正式なパラメーターとしての参照ではなく、ローカル参照に特別な例外を設けないこと) というものでした。当時、私たちのどちらも ScopeGuard に精通していなかったと思います。振り返ってみるとシンプルですが、そのようなことを思いつくには、ペトルやアンドレイのような心が必要です! :-)
乾杯 & hth。
定数参照、sの参照および定数について少し説明しdouble
ます。
参照は既存のオブジェクトを参照しており、再装着することはできません。 つまり、参照を宣言(定義)すると、常にそのアイテムを参照します。
C ++言語では、定数参照を宣言できます。これは、参照が変更されないことをコンパイラーに通知します。参照を再設定できないため、これは冗長になる可能性があります。ただし、言語構文ではそれが可能です。
定数は値であり、何も参照しません。
コンパイラーは、定数またはリテラルのオブジェクトへの参照を、定数またはリテラルの対応するオブジェクトに置き換える(置き換える)ことができます。ただし、コンパイラーは、使用されるスコープ内でそのオブジェクトに対して書き込み操作が実行されないことを保証できます。参照がそのスコープ内のメソッドまたは関数に渡されると、この決定が困難になる可能性があります。
参照に修飾子を指定するconst
と、コンパイラーの最適化作業が容易になります。定数参照は、参照が変更されないというプログラマーとユーザーとの契約です。
参照との重要な違いは、参照自体が継承的に定数であることです。参照自体が最初に変数に割り当てられると、別の変数を参照できなくなります。それを変更しようとすると、それが参照する変数が変更されます。これを考えると、const
は参照が への参照であることを意味しますconst int
。
const int A;
const int B;
const int& Reference = A;
Reference = B; // Error, the value of A can not be assigned, nor would this *ever* be able to make Reference refer to B.
次のように、参照自体が定数であるというこの理論をテストすることもできます。
const int& const Reference; // Should give a warning about the second const being redundant.
const double&は定数doubleへの参照であり、もう1つは定数doubleへの参照です。参照は一種のconstポインターであり、決して変更されないポインターです。
参照は const ではなく、値が const であるため、参照を再割り当てできるはずです。つまり、次のようにすれば問題ありません。
const double& pi = 3.14;
const double pi2 = 2.78;
pi = *(&pi2);