2016-03-20 9 views
3

2行目のコンパイル中に最初の行がコンパイルされないのはなぜですか?C++ - クラス型のコンストラクタは左辺値を返しますか?

float& t = float(10); // initial value of reference to non - const must be an lvalue 
string& w = string("gg"); 

これは、文字列コンストラクタが左辺値を返すことを意味しますか?

+0

g ++ 4.8.2は、これらの行の*それぞれについて、 "エラー:型の非const参照の無効な初期化"を示します。 –

+0

これは良い質問です。私はここに誰かがダウン投票/クローズ投票の質問をいつも持っているのだろうと思っています。ここの一部のユーザーは、その権限を正当に奪われるべきです。 –

+1

MSVCを使用していて、/ W4でコンパイルしていないため、2行目がコンパイルされているようです。/W4でコンパイルしていれば、 "C4239:非標準拡張機能の使用"のようなものを見たはずです。 – cpplearner

答えて

3

定義によるコンストラクタには戻り値がありません。実行しようとしているのは、許可されていない一時的な値を参照することです。

lvaluervalueの両方を理解するのに良い記事はC++ Rvalue References Explainedです。

float& ref = float(10); 

何ここで起こるん:

+0

"実行しようとしているのは、許可されていない一時的な値を参照することです。"はい、私はこの声明に同意します。私はちょうど第2ラインがコンパイルする理由を混乱させた。 cpplearnerが正しいです。私はMSVCを使用しています。おそらくMSVCにはいくつかの特殊な特性がありますか? – Eugene

+0

これはgccとclangの両方で同じエラーが発生するため、奇妙です。 'constでない参照をrvalueから初期化できません '。 – karastojko

2

あなたは何を得ているが、あなたが期待しているものではありませんか? float(10)は、一時的な浮動小数点(何にも束縛されていない)を作成するため、の右辺値です。したがって、非const左辺参照にバインドすることはできません。

float const & cref = float(10); // OK! 

std::stringと同じメカニズムがあります。私はあなたが文字列の例でコンパイルエラーを受け取らないことに困惑しています(私はgcc 5.3.0で行います)

これはコンストラクタには「コンストラクタの戻り値」とは関係がありませんそのようなこと。

+0

あなたの答えをありがとう。 MSVCを使用しているからです。 – Eugene

関連する問題