int *b = new int();
const int *&a = b;
IDEは、 "タイプint*
の式からタイプconst int*&
の参照の無効な初期化" をC++:無効なタイプの参照の初期化 'のconst int型*&' 型の式から 'int型*'
を示し、I理解していない。
int *b = new int();
const int *&a = b;
IDEは、 "タイプint*
の式からタイプconst int*&
の参照の無効な初期化" をC++:無効なタイプの参照の初期化 'のconst int型*&' 型の式から 'int型*'
を示し、I理解していない。
あなたは異なる種類の参照をバインドすることはできません。この場合はint *
とconst int*
です。
const int *&a = b;
の場合、b
はint*
であり、最初に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にする。
b
はをintへのポインタである。a
は、const intへのポインタへの参照です。したがってb
はa
に割り当てられません。
はおそらく代わりにをintにのconstポインタへの参照をしたい:
int *b = new int();
int *const &a = b;
問題は、これらの2つのタイプ
int *
と
const int *
は、2つの異なるタイプがあるということです。したがって、変数
b
である右側の式は
const int *
の
rvalue
に変換されます。
rvalue
に定数ではない参照をバインドすることはできません。あなたは
const int * const &a = b;
を記述する必要がありますので、正式な理由はint*
とconst int*
は、異なるタイプであるということです、と変換が一時的に作成し、あなたが一時的に非const参照をバインドすることはできません。それはのconstポインタへの参照が働くだろう作る
:
const int * const &a = b;
動機たとえば、のは、これが許されたと仮定しましょう:
int* p = nullptr;
const int*& rp = p;
rp
とp
今同じオブジェクトを参照してください。
const int
を作りましょう。
const int y = 1;
const int*
からconst int*
を割り当てると、安全な権利でなければなりません?。
rp = &y;
今
、*p
がconstのではないので、我々はそれに新しい値を割り当てることができます。
*p = 0xbaad1dea;
しかしp
がrp
と同じオブジェクトである、と*rp
はそう*p
もy
あるy
です、y
はconst
であり、現在は未定義の動作です。
理由は、ここでは説明しています(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