6

私が最近行った回答のコメントで進行中の議論を食い止めるために、次の質問に対する建設的な回答をお願いします。

  1. 参照の有効期間は、それが参照するオブジェクトとは異なりますか? 参照は単にそのターゲットのエイリアスですか?
  2. 参照は、未定義の動作を引き起こすことなく、整形式のプログラムでそのターゲットを存続させることができますか?
  3. 元のオブジェクトに割り当てられたストレージが再利用される場合、新しいオブジェクトを参照するために参照を作成できますか?
  4. 次のコードは、未定義の動作を呼び出すことなく上記の点を示していますか?

Ben Voigtによるコード例と簡略化 ( ideone.comで実行):

#include <iostream>
#include <new>

struct something
{
    int i;
};

int main(void)
{
    char buffer[sizeof (something) + 40];
    something* p = new (buffer) something;
    p->i = 11;
    int& outlives = p->i;
    std::cout << outlives << "\n";
    p->~something(); // p->i dies with its parent object
    new (p) char[40]; // memory is reused, lifetime of *p (and p->i) is so done
    new (&outlives) int(13);
    std::cout << outlives << "\n"; // but reference is still alive and well
                                   // and useful, because strict aliasing was respected
}
4

2 に答える 2