次のコードは許可されています
struct Foo {
int x;
};
Foo f;
Foo & f_ref = f;
(&f) -> ~Foo ();
new (&f) Foo ();
int x = f_ref .x;
ただし、次のコードは許可されていません
struct Foo {
const int & x; // difference is const reference
Foo (int & i) : x(i) {}
};
int i;
Foo f (i);
Foo & f_ref = f;
(&f) -> ~Foo ();
new (&f) Foo (i);
int x = f_ref .x;
$3.8/7のため
オブジェクトの有効期間が終了した後、オブジェクトが占有していたストレージが再利用または解放される前に、元のオブジェクトが占有していたストレージの場所に新しいオブジェクトが作成された場合、元のオブジェクトを指すポインタ、その参照または、元のオブジェクトの名前が自動的に新しいオブジェクトを参照し、新しいオブジェクトの有効期間が開始されると、新しいオブジェクトを操作するために使用できます。
- 元のオブジェクトの型が const 修飾されておらず、クラス型の場合、型が const 修飾されているか参照型である非静的データ メンバーが含まれていない...
f.x
f が存在しなくなったときにへの参照を無効にする方法は理解できますf_ref
が、そのメンバーの 1 つが const および/または参照であり、それ以外ではないという理由だけで無効にする必要があるFoo
理由がわかりません。Foo
その後への参照です。
誰かがこの状態の背後にある理論的根拠を説明できますか?
編集
答えてくれてありがとう。現在、オプティマイザーがリファランドをキャッシュすることを許可していないため、「変更されないことを保証する」という引数は購入しません。次に例を示します。
struct Foo {
const int & x;
Foo (const int & i) : x(i) {}
void do_it ();
};
int i;
Foo f (i);
const int & ii = f.x;
f .do_it (); // may modify i
std :: cout << ii; // May NOT use cached i
do_it
参照された値を無効にする方法がわかりませんが、そうoperator new
ではありません -- シーケンス ポイントはキャッシュされた値を無効にします。delete/placement-new を除外する必要があるのはなぜですか?