2013-09-02 31 views
11

は、なぜあなたはこの非constの左辺値参照

int a; 
const double &m = a; 

行うことができますしかし、あなたはこの

int a; 
double &m = a; 

を行う際にエラーが発生しますか?

error: non-const lvalue reference to type 'double' cannot bind to a value of unrelated type 'int' 

編集:

私は非const参照が一時オブジェクトをバインドすることはできません理由を理解しようとしています。具体的に。

+0

この質問は、const参照の一時的な値へのバインドを許可するルールがあるか、なぜその理由を知りたいかを知る必要があります。あなたはおそらく両方の種類の回答を得るでしょうが、あなたはそのうちの1つだけに興味があるでしょう...それは何ですか? – DanielKO

+0

私はその根拠を知りたい。 – Ares

+1

エラーメッセージはここで少し混乱します。私はいくつかのことを期待しています - 'error: 'double'型のrvalueから 'double&'型の非const参照の無効な初期化。 – Mahesh

答えて

12

これは、一時的なものが非const参照にバインドできないためです。

double &m = a; 

aタイプintであり、doubleに変換されます。一時的なものが作成されます。同様に、ユーザー定義型の場合も同じです。

Foo &obj = Foo(); // You will see the same error message. 

しかし、Visual Studioでは、デフォルトで有効になっているコンパイラの拡張機能が原因で問題なく動作します。しかし、GCCは文句を言うでしょう。

3

一時的に変更を加えることは意味がないので、C++では非const参照を一時的にバインドすることは望ましくありません。 たとえば、

int a; 
double &m = a; // caution:this does not work. 

どうすればいいですか? aはint型で、doubleに変換されています。一時的なものが作成されます。

あなたは(問題を引き起こす可能性がさらに悪い何、あなたがaを考えるかもしれない変化していない、)一時的にバインドされますが、変更は、変数aは変更されませんhappens.Afterほとんど何もmを、変更することができます。

関連する問題