为了阻止我最近给出的答案的评论中发生的争论,我想对以下问题提供一些建设性的答案:
- 引用的生命周期与它所引用的对象不同吗?引用只是其目标的别名吗?
- 引用能否在格式良好的程序中超过其目标而不会导致未定义的行为?
- 如果为原始对象分配的存储被重用,是否可以引用新对象?
- 以下代码是否在不调用未定义行为的情况下演示了上述几点?
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
}