0

エラー!

$ cat double.cc
#include<iostream>

int main() {
    int i = 42;
    double &r = i;
}
$ g++ double.cc
double.cc: In function ‘int main()’:
double.cc:5: error: invalid initialization of reference of type ‘double&’
from expression of type ‘int’
$

動作します!

$ cat double.cc
#include<iostream>

int main() {
    int i = 42;
    const double &r = i;
}
$ g++ double.cc
$

最初のケースでエラーが発生するのはなぜですか? これがここで議論されていることは知っていますが、 inttoが許可されているのに、なぜこれが許可されていないのか理解できませんconst double&か?

4

3 に答える 3

6
int i = 42;
double &r = i;

ここrに への参照がありますがdouble、でiはありません。doubleでは、どのようrに参照できますか? できない。doubleしたがって、式から型の一時オブジェクトを作成しますi。ただし、rこれは非 const参照であり、一時オブジェクトにバインドできません。

ただし、 const 参照にすると、次のように機能します。

double const & r = i;

const参照は、 から作成された一時オブジェクトにバインドできることに注意してくださいi

于 2012-09-14T16:06:50.920 に答える
4

C++ では、参照を別の変数へのエイリアスと考えることができます。これらは、cv 修飾されていない型で一致する必要があり、この場合、型は異なります。

それが機能する理由const double&は、コンパイラがの値doubleのコピーで一時を作成しi、 const 参照をその一時にバインドするためです。これが許されるのは、テンポラリへのバインドによって、テンポラリの寿命が参照の寿命まで延長されるためです。

于 2012-09-14T16:09:57.177 に答える
4

あなたが書くとき

int i = 42;
double const &r = i;

i暗黙的に double に変換され、一時的な値またはrvalueになります。非 const 参照は右辺値にバインドすることが許可されていないため、上記が機能rするには である必要があります。double const&

于 2012-09-14T16:10:15.913 に答える