C++ 引用相对于其目标的生存期

C++ 引用相对于其目标的生存期,c++,reference,undefined-behavior,object-lifetime,C++,Reference,Undefined Behavior,Object Lifetime,为了阻止评论中的争论,我想对以下问题给出一些建设性的回答: 引用的生存期是否与其引用的对象不同?引用只是其目标的别名吗 在一个结构良好的程序中,引用是否能够在不导致未定义行为的情况下超过其目标 如果重新使用为原始对象分配的存储,是否可以引用新对象 下面的代码是否在不调用未定义行为的情况下演示了上述要点 示例代码由和简化(在上运行): #包括 #包括 构造某物 { int i; }; 内部主(空) { 字符缓冲区[sizeof(某物)+40]; 某物*p=新(缓冲)某物; p->i=11; int

为了阻止评论中的争论,我想对以下问题给出一些建设性的回答:

  • 引用的生存期是否与其引用的对象不同?引用只是其目标的别名吗
  • 在一个结构良好的程序中,引用是否能够在不导致未定义行为的情况下超过其目标
  • 如果重新使用为原始对象分配的存储,是否可以引用新对象
  • 下面的代码是否在不调用未定义行为的情况下演示了上述要点
  • 示例代码由和简化(在上运行):

    #包括
    #包括
    构造某物
    {
    int i;
    };
    内部主(空)
    {
    字符缓冲区[sizeof(某物)+40];
    某物*p=新(缓冲)某物;
    p->i=11;
    int&outlives=p->i;
    std::i是否可以与其父对象一起消亡
    new(p)char[40];//内存被重用,*p(和p->i)的生存期就这样结束了
    新建(和更新)int(13);
    标准::cout
    
  • 是的。例如,本地非静态引用具有自动存储持续时间和相应的liifetime,并且可以引用具有更长生存期的对象

  • 是的,悬挂引用就是一个例子。只要这些引用在悬挂时没有在任何表达式中使用,就可以了

  • 第3条中有一条关于这种情况的特殊规则。对象、指针和引用的名称会自动引用在受限条件下重用存储的新对象。我相信这是在3.8的末尾。手边有规范的人请在此处填写正确的引用

  • 引用的生存期是否与其引用的对象不同?引用是否只是其目标的别名

    引用有自己的生存期:

    int x = 0;
    {
       int& r = x;
    }      // r dies now
    x = 5; // x is still alive
    
    对-
    常量的引用
    还可以延长其仲裁人的寿命:

    int foo() { return 0; }
    const int& r = foo();   // note, this is *not* a reference to a local variable
    cout << r;              // valid; the lifetime of the result of foo() is extended
    
    int foo(){return 0;}
    const int&r=foo();//注意,这*不是*对局部变量的引用
    
    这是一大堆问题,每个问题都需要一些标准的措辞引语才能正确回答(考虑到问题的性质,我认为你希望标准引语作为正确的答案)。如果我们专注于其中一个问题,可能会更有用,如果在这种情况下有用,只回答其他问题…我同意。请每个问题回答一个问题。你会发现子问题以前已经回答过。而且,代码示例的内容太多了。制作一个小测试用例。我对代码示例和多个问题表示歉意le问题。这与评论讨论中给出的代码相同,我觉得这个问题有足够的相关性,可以一起提问。我将这些问题总结为“引用是否可以超过其目标,并且在不调用未定义行为的情况下重用?”现在,我还简化了代码示例。如果引用是A)局部引用,并且b)绑定到prvalue,则对const的引用只会延长临时对象的生存期,prvalue的求值会创建所述临时对象。(因此,对成员或绑定到xvalues的局部引用不起作用。)此外,非常量右值引用以完全相同的方式延长生存期。
    int foo() { return 0; }
    const int& r = foo();   // note, this is *not* a reference to a local variable
    cout << r;              // valid; the lifetime of the result of foo() is extended