型のオブジェクトは、をに変換できないのとまったく同じ理由で、にChild*
バインドすることはできません。これを許可すると、プログラマーは(意図的であろうとなかろうと)キャストなしで型安全性を破ることができます。Parent*&
Child**
Parent**
class Animal {};
class DangerousShark : public Animal {};
class CuteKitten : public Animal {};
void f(Animal*& animalPtrRef, Animal* anotherAnimalPtr)
{
animalPtrRef = anotherAnimalPtr;
}
void g()
{
DangerousShark myPet;
CuteKitten* harmlessPetPtr;
f(harmlessPetPtr, &myPet); // Fortunately, an illegal function call.
}
編集
「変換」と「変換」という言葉の使用が緩いために、混乱が生じると思います。
再割り当てできるオブジェクトとは異なり、参照をリバウンドすることはできません。そのため、変換について話すときの参照のコンテキストでは、新しい参照の初期化についてのみ懸念することができます。
参照は常にオブジェクトにバインドされており、OPの質問から、彼が既存のオブジェクトに直接バインドされている参照を取得することを目指していることは明らかでした。これは、参照の初期化に使用されるオブジェクトが参照のタイプと参照互換である場合にのみ許可されます。基本的に、これはタイプが同じである場合、またはオブジェクトのタイプが参照のタイプから派生し、参照タイプが少なくとも初期化オブジェクトと同じようにcv修飾されている場合にのみ発生します。特に、異なる型へのポインタは、ポイントされた型の関係に関係なく、参照互換ではありません。
その他の場合、参照は、参照タイプに変換できるもので初期化できます。ただし、これらの場合、参照はconstであり、揮発性ではない必要があり、変換によって一時オブジェクトが作成され、参照は元のオブジェクトではなく、この一時オブジェクトにバインドされます。指摘したように、これはOPのやる気を起こさせる例の要件には適していません。
要約すると、aをに直接バインドすることはChild
できますParent&
が、aChild*
をに直接バインドすることはできませんParent*&
。AParent* const&
はで初期化できますChild*
が、参照は実際にはオブジェクトParent*
からコピー初期化された一時オブジェクトにバインドされChild*
ます。