const引用数据成员绑定到临时初始化构造函数中的引用

Mar*_*tin 2 c++

请考虑以下代码:

#include <iostream>

struct A {
    const char *name;

    A() : name("A") {
        std::cout << "A()\n";
    }

    virtual ~A() {
        std::cout << "~A()\n";
    }
};

class B {
    const A& a;
public:

    B() : a(A()) {
    };

    void print_data() const {
        std::cout << a.name << '\n';
    }

    ~B() {
        std::cout << "~B()\n";
    }
};

int main() {
    B b;
    b.print_data();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

GCC 4.4的输出是:

A()~A()A~B()

这看起来很奇怪.我原本期望A的临时实例的副本被绑定到B :: a或者临时本身在~B()期间被破坏.

基本上,我认为B :: a在b的生命期间始终是有效的参考.事实上,b.print_data()显然工作,编译器不会发出任何警告.

标准c ++ 98/03对此事有何评价?

Xeo*_*Xeo 5

不断的引用并没有延长阶级,时期的临时生活.就是这样.他们只Foo const& f = Foo();foo返回按值的地方执行此操作,但就是这样.

§12.2 [class.temporary]

p4有两种情况,临时表在不同于完整表达结束时被销毁.[...]

p5第二个上下文是引用绑定到临时的.除了下面指定的内容之外,引用绑定的临时对象或作为临时绑定对象的子对象的完整对象的临时对象的生命周期仍然存在.绑定到构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定将持续存在,直到构造函数退出.