Время жизни ссылки относительно ее цели

Чтобы остановить аргумент, продолжающийся в комментариях к ответ, который я недавно дал , я хотел бы получить конструктивные ответы на следующие вопросы:

  1. Отличается ли время жизни ссылки от объекта, на который она ссылается? Является ли ссылка просто псевдонимом для своей цели?
  2. Может ли ссылка пережить свою цель в правильно сформированной программе, не приводя к неопределенному поведению?
  3. Можно ли сделать ссылку для ссылки на новый объект, если память выделена для исходный объект используется повторно?
  4. Демонстрирует ли следующий код вышеуказанные моменты без вызова неопределенного поведения?

Пример кода, сделанный Беном Фойгтом и упрощенный (запустите его на ideone.com ]):

#include 
#include 

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
}

6
задан Community 23 May 2017 в 12:00
поделиться