2017-01-26 7 views
2
int *b = new int(); 
const int *&a = b; 

IDEは、 "タイプint*の式からタイプconst int*&の参照の無効な初期化" をC++:無効なタイプの参照の初期化 'のconst int型*&' 型の式から 'int型*'

を示し、I理解していない。

+1

理由は、ここでは説明しています(http://c-faq.com/ansi/constmismatch.html)。以下を考えてみましょう: 'const int i = 0; int * p; const int *&z =&p; z =&i; ' - ' p'は 'i'を指すことができません。しかし、この変換が許されている場合は、参照を介して 'p'を' i'を指すように変更し、それを使って 'i'を変更することができます。 – chris

答えて

2

あなたは異なる種類の参照をバインドすることはできません。この場合はint *const int*です。

const int *&a = b;の場合、bint*であり、最初にconst int*に変換する必要があります。暗黙的な変換はここで許可されますが、変換されたconst int*は一時的なものであり、aにバインドすることはできません。それは非定数への左辺値の参照であるためです。一方、temporary objectは左辺値参照をするCONSTに結合することができ、または右辺値参照

、すなわち

const int * const &a = b; // fine, and the lifetime of the temporary is extended to match the lifetime of the reference a 

aがCONSTポインタへの左辺値参照として宣言されている注constの位置、 const intにする。

2
  • bはをintへのポインタである
  • aは、const intへのポインタへの参照です。

したがってbaに割り当てられません。

はおそらく代わりにをintにのconstポインタへの参照をしたい:

int *b = new int(); 
int *const &a = b; 
0

問題は、これらの2つのタイプ

int * 

const int * 

は、2つの異なるタイプがあるということです。したがって、変数 bである右側の式は const int *rvalueに変換されます。

rvalueに定数ではない参照をバインドすることはできません。あなたは

const int * const &a = b; 
0

を記述する必要がありますので、正式な理由はint*const int*は、異なるタイプであるということです、と変換が一時的に作成し、あなたが一時的に非const参照をバインドすることはできません。それはのconstポインタへの参照が働くだろう作る

const int * const &a = b; 

動機たとえば、のは、これが許されたと仮定しましょう:

int* p = nullptr; 
const int*& rp = p; 

rpp今同じオブジェクトを参照してください。

const intを作りましょう。

const int y = 1; 

const int*からconst int*を割り当てると、安全な権利でなければなりません?。

rp = &y;   

*pがconstのではないので、我々はそれに新しい値を割り当てることができます。

*p = 0xbaad1dea; 

しかしprpと同じオブジェクトである、と*rpはそう*pyあるyです、yconst

であり、現在は未定義の動作です。

関連する問題