2行目のコンパイル中に最初の行がコンパイルされないのはなぜですか?C++ - クラス型のコンストラクタは左辺値を返しますか?
float& t = float(10); // initial value of reference to non - const must be an lvalue
string& w = string("gg");
これは、文字列コンストラクタが左辺値を返すことを意味しますか?
2行目のコンパイル中に最初の行がコンパイルされないのはなぜですか?C++ - クラス型のコンストラクタは左辺値を返しますか?
float& t = float(10); // initial value of reference to non - const must be an lvalue
string& w = string("gg");
これは、文字列コンストラクタが左辺値を返すことを意味しますか?
定義によるコンストラクタには戻り値がありません。実行しようとしているのは、許可されていない一時的な値を参照することです。
lvalue
とrvalue
の両方を理解するのに良い記事はC++ Rvalue References Explainedです。
float& ref = float(10);
何ここで起こるん:
"実行しようとしているのは、許可されていない一時的な値を参照することです。"はい、私はこの声明に同意します。私はちょうど第2ラインがコンパイルする理由を混乱させた。 cpplearnerが正しいです。私はMSVCを使用しています。おそらくMSVCにはいくつかの特殊な特性がありますか? – Eugene
これはgccとclangの両方で同じエラーが発生するため、奇妙です。 'constでない参照をrvalueから初期化できません '。 – karastojko
あなたは何を得ているが、あなたが期待しているものではありませんか? float(10)
は、一時的な浮動小数点(何にも束縛されていない)を作成するため、の右辺値です。したがって、非const左辺参照にバインドすることはできません。
float const & cref = float(10); // OK!
std::string
と同じメカニズムがあります。私はあなたが文字列の例でコンパイルエラーを受け取らないことに困惑しています(私はgcc 5.3.0で行います)
これはコンストラクタには「コンストラクタの戻り値」とは関係がありませんそのようなこと。
あなたの答えをありがとう。 MSVCを使用しているからです。 – Eugene
g ++ 4.8.2は、これらの行の*それぞれについて、 "エラー:型の非const参照の無効な初期化"を示します。 –
これは良い質問です。私はここに誰かがダウン投票/クローズ投票の質問をいつも持っているのだろうと思っています。ここの一部のユーザーは、その権限を正当に奪われるべきです。 –
MSVCを使用していて、/ W4でコンパイルしていないため、2行目がコンパイルされているようです。/W4でコンパイルしていれば、 "C4239:非標準拡張機能の使用"のようなものを見たはずです。 – cpplearner