まず、1つのことを明確にしましょう。 文字通り参照をコピーすることも可能かどうかわからない。
int i = 10;
int& ref = i; // since this moment ref becomes "untouchable"
int& alt_ref = ref; // actually, means int& alt_ref = i;
私はref
は、いくつかのクラスのメンバーであり、あなたは、このクラスのインスタンスをコピーする場合、同じ問題が発生したと思います。 さらに、コードをもっと見ると、「参照をコピーする」ことさえできず、初期化されていない(まだ)オブジェクトの参照を初期化することはありません。
struct Parent
{
Object& ref;
Parent(Object& i): ref(i) { }
};
struct Child : Parent
{
Object obj;
Child(int i): Parent(obj), obj(i) { }
};
が物理的に等価である:それは言われていると
struct Child
{
Object& ref;
Object obj;
Child(int i): ref(obj), obj(i) { }
};
、あなたの質問は、実際には意味:
はそれがに未定義の動作であるオブジェクトを初期化する 前の基準を初期化しますそれは約を参照していますか?
同様に、オブジェクトのライフタイムが開始された前しかし後:ここ
は、C++標準からの引用である(§3.8.6[basic.life/6])、おそらく答えを与えますオブジェクトが占有するストレージが割り当てられているか、またはオブジェクトの寿命が終了した後で、オブジェクトが占有したストレージが再利用または解放される前に、 オリジナルオブジェクトを参照するglvalueが使用されます限られた方法で構築または破壊中のオブジェクト については、12.7を参照してください。そうでない場合、そのようなglvalue は、割り当てられたストレージ(3.7.4.2)を参照し、その値に依存しないgl値のプロパティを使用すると、明確に定義されます。
そして§12.7.1[class.cdtor/1]だけ書かれています:
...コンストラクタは、実行結果を開始する前に、オブジェクト のいずれかの非静的メンバまたは基本クラスを参照未定義の振る舞いでしたがって、「オブジェクト自体を参照」、「オブジェクトのメンバを参照し、」のみ言及§12.7.1
は§3.8.6に該当します。 このようにして、初期化されていない(しかし既に割り当てられている)オブジェクトを参照することは明確に定義されているという結論を下します。
間違いがある場合は、私にコメントでお知らせください。また、この回答を編集してください。
編集: 私はちょうどそのような結論が妥当であると言いたいと思います。オブジェクトの初期化はメモリ内の位置を変更することはできません。既に割り当てられたメモリへの参照を初期化される前に保存するのは悪いですか?
初期化されていない参照はありませんが、初期化されていないオブジェクトへの参照はありません。これは、標準から引用した場合とは異なります。すべてが初期化されるまで、 'Parent'が参照を使用しない限り、コードは正常です。 –
ありがとう、あなたの発言を反映するためにタイトルを更新しました。あなたが言うことは、初期化されていないオブジェクトへのポインタで何が起きるかという意味で意味があります。 – Flynsee
ボスのコメントはあなたの質問に答えましたか?または、あなたが尋ねたことの違いを明確にするために編集しましたか? – Yunnosch