gpt4 book ai didi

c++ - 绑定(bind)到已销毁堆栈变量的 const 引用的生命周期

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:24 27 4
gpt4 key购买 nike

我想知道它是否偶然指向绑定(bind)到已销毁堆栈变量的 const 引用的指针可以正常工作。
我在 rvalues 上读到 const 引用生命周期延长,所以这是“正常”的 const 引用作品,但在 Storage ref 的 ctor 末尾应该被销毁,不是吗?
const 引用的生命周期是否也延长了,因为我在指针中检索了它的地址,还是这纯粹是运气?

Live example

#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;
}

它也在使用结构 Live example

#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;
}

最佳答案

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

您关于“const 引用生命周期在右值上得到延长”的评论在某些情况下是正确的,但 someValue 是一个左值

关于c++ - 绑定(bind)到已销毁堆栈变量的 const 引用的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31748680/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com