-
22-09-2019 - |
質問
誰でも説明しっかり計算はどこでわかりますか?
class A{};
const A& a = A(); // correct
A& b = A(); // wrong
という
無効な初期化の非定数の参照型 A&
から仮設のタイプ A
なぜ const
物。
解決
非定数の参照が必要initialised l-値です。ただinitialiseしtemporaries、そうのか?
int& foo = 5;
foo = 6; // ?!
const
参考文献の特性その寿命を延ばし審判、さらには const
, であることができます改造してみてはいかがでしょうかいいります。例えば:
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-価値が非定数の参考にする。
きを割り当てるには、R値を定数の参照が理由では曖昧.
C++言語にしておくことは違法行為とな取り付けて非定数の参照をrvalueがありますが、完全にOKを添付して定数への参照rvalue.例えば、これは法的
const int& r = 5;
このような
int &r = 5; // ERROR
臨時の型のオブジェクト A
によって返される表現 A()
はrvalue、上記のルールを適用する場合とします。
のための臨時/rvalueできるだけで、定数参考値です。
ができて非定数の参照は、非臨時/lvalue.
A a;
A& b = a;
そもそもなぜ強化のrvalueが一時的であり価値で変更するものではな一瞬.
の普及を図るため、この言う:
§8.5.3.5...そうしないと、参照はlvalueへの参照を不揮発性定数タイプ---
しかし、いくとることができ:
#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定数は定数よりも生じません.(§1.9(4))
このように上記のコードはありません技術的な理由には差額をいただきます。るものでなく、デザイナーが制作した夢うユーザーのような非定数の参照temporaries.