const引用的生命周期绑定到销毁的堆栈变量

Ric*_*lly 4 c++ reference object-lifetime

我想知道是否偶然指向绑定到已销毁堆栈变量的const引用的指针可以正常工作.
我读取const引用生命周期是在rvalues扩展,所以这是"正常"的const引用工作,但是在存储引用的ctor的末尾应该被销毁,不是吗?
const引用生命周期是否也被扩展,因为我在指针中检索它的地址或者这是纯粹的运气?

实例

#include <iostream>

class Storage
{
public:
    Storage(const int& ref)
    {
        p = &ref;
    }

    const int* Get() const
    {
        return p;
    }

private:    
    const int* p;
};

int main()
{
    Storage* s = nullptr;

    {
        int someValue = 42;
        std::cout << &someValue << std::endl;
        s = new Storage(someValue);
    }

    const int* p = s->Get();
    std::cout << p << std::endl;
    std::cout << *p << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

它也使用struct Live示例

#include <iostream>

struct Dummy
{   
    int value;
};

class Storage
{
public:
    Storage(const Dummy& ref)
    {
        p = &ref; // Get address of const reference
    }

    const Dummy* Get() const
    {
        return p;
    }

private:    
    const Dummy* p;
};

int main()
{
    Storage* s = nullptr;

    {
        Dummy dummy;
        dummy.value = 42;
        std::cout << &dummy << std::endl;
        s = new Storage(dummy);
    }

    const Dummy* p = s->Get();
    std::cout << p << std::endl;
    std::cout << p->value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

Cor*_*mer 9

你的s变量确实有一个悬空指针someValue已超出范围.因此,您的代码显示未定义的行为.

关于"const参考生命周期在rvalues上扩展"的注释在某些情况下是正确的,但是someValue左值.