c++ - 为什么从临时初始化的引用成员仍然可读?

标签 c++ reference initialization

<分区>

Possible Duplicate:
Can a local variable's memory be accessed outside its scope?
C++ constructor: garbage while initialization of const reference

这个问题与我之前问过的另一个问题直接相关:"Opaque reference instead of PImpl. Is it possible?" .

假设我们有一个类,其中包含其他某个类的引用成员,该类在构造函数中被初始化为一个临时变量:

#include <iostream>

struct B
{
    B(int new_x = 10) : x(new_x) { std::cout << "B constructed\n"; }
    ~B() { std::cout << "B destroyed\n"; }

public:
    int x;
};

struct A
{
    A()
    : b( B(23) )
    {
        std::cout << "A constructed\n";
    }

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

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

public:
    const B& b;
};

int main()
{
    A a;
    a.Foo();
    cout << "x = " << a.b.x << endl;
}

当我运行上面的代码时,输​​出是:

B constructed
B destroyed
A constructed
A::Foo()
x = 23
A destroyed

看来即使temporary被销毁所以引用成员应该是无效的,引用成员的整数字段仍然是可读的。为什么它仍然有效?

最佳答案

未定义的行为。在您的情况下,临时 B 之前占用的内存在您引用它之前不会被覆盖。下次您运行该程序时,任何事情都可能发生。

注意表面相似

const B &b = B();

确实有定义的行为;临时 B 的生命周期通过引用绑定(bind)得到延长。这仅适用于引用变量,不适用于引用成员。

关于c++ - 为什么从临时初始化的引用成员仍然可读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12602959/

相关文章:

c++ - 使用 C++11 将可变函数参数转发给可变函数

c++ - QToolTip::showText 在鼠标释放后消失

c# - 我可以避免引用现有引用继承自的程序集吗?

c++ - 为什么我不能将新元素推回到列表中

java - 当初始化变量链接到另一个变量时?

initialization - Redux 中的初始化状态问题为 "@@redux/init"

javascript - 如果一个JS 6模块被导入到一个页面的多个模块中,那么它的 "main line"代码是否只执行一次?

c++ - 如何使用 taglib 编写 id3v2.3

c++ - 在访问多维数组的内置数组和初始化列表时交换标识符和下标

arrays - 快速引用对象