これら2つのステートメントに違いがある理由を誰か説明できますか?
class A{};
const A& a = A(); // correct
A& b = A(); // wrong
A&
タイプの一時からのタイプの非定数参照の無効な初期化を示していますA
なぜconst
ここで重要なのですか?
これら2つのステートメントに違いがある理由を誰か説明できますか?
class A{};
const A& a = A(); // correct
A& b = A(); // wrong
A&
タイプの一時からのタイプの非定数参照の無効な初期化を示していますA
なぜconst
ここで重要なのですか?
非 const 参照は左辺値で初期化する必要があります。それらを一時的に初期化できるとしたら、次はどうしますか?
int& foo = 5;
foo = 6; // ?!
const
参照には、レフリーの寿命を延ばすという特別な特性があり、それらはconst
.xml であるため、メモリにないものを変更しようとする可能性はありません。例えば:
const int& foo = 5;
foo = 6; // not allowed, because foo is const.
参照は、一時変数だけでなく、実際に何かを参照する必要があることに注意してください。たとえば、次は有効です。
int foo = 5;
int& bar = foo;
bar = 6;
assert(foo == 6);
これに関する用語は少し紛らわしいです。もう少し詳しく調査することをお勧めします。ただし、短い答えは次のとおりです。
一時オブジェクト (クラスのコンストラクターを呼び出した結果) を変数に割り当てています。一時オブジェクトは R 値です。R 値を const 以外の参照に割り当てることはできません。
R 値を const 参照に割り当てることは許可されていますが、それを許可する根拠はかなりあいまいです。
一時/右辺値の場合、const 参照のみを持つことができます。
非一時/左辺値への非 const 参照を持つことができます。
A a;
A& b = a;
その理由は、一時的に消えるものを変更できることにほとんど価値がないため、右辺値が一時的であるという事実を強化するためだと思います。
C++ 言語では、右辺値に非 const 参照をアタッチすることは違法ですが、右辺値に const 参照をアタッチすることは完全に問題ありません。たとえば、これは合法です
const int& r = 5;
これはそうではありませんが
int &r = 5; // ERROR
A
式によって返されるタイプの一時オブジェクトはA()
右辺値であるため、上記のルールはあなたの場合にも適用されます。
標準がそう言っているので:
§8.5.3.5 ... それ以外の場合、参照は非揮発性 const 型への左辺値参照でなければなりません ...
ただし、非常に必要な場合は、次の方法で入手できます。
#include <iostream>
int main()
{
const int & cr=5;
int & r=const_cast<int &>(cr);
r=6;
std::cout<<r;
}
// outputs 6 with c++/clang++, Debian 8, amd64
ただし、想定されている定数 cr も const ではなくなり、未定義の動作が発生することに注意してください。(§1.9 (4))
上記のコードで示唆されているように、違いに技術的な理由はありません。むしろ、設計者は、ユーザーが一時変数への非 const 参照をどうするかについて悪夢を見ました。