c++中的引用范围是啥? [复制]

Posted

技术标签:

【中文标题】c++中的引用范围是啥? [复制]【英文标题】:What is the scope of references in c++? [duplicate]c++中的引用范围是什么? [复制] 【发布时间】:2019-12-08 11:04:52 【问题描述】:
   class fu

public:
    int pub;
    fu()  pub = 1; 

    ~fu() 
        std::cout << pub << "end"<<std::endl;
    
;
fu& fub() 
    fu a;
    fu& re = a;
    return a;

int main() 
    std::cout << ++fub().pub;

输出:1 结束 \n 2

我预计引用会出错,因为函数中的变量已终止。但是,调用了析构函数并且 main 函数起作用了。参考指向什么?

【问题讨论】:

这能回答你的问题吗? Can a local variable's memory be accessed outside its scope?讲的是指针,但是引用的结果是一样的。 你所拥有的是未定义的行为。 【参考方案1】:

引用指向已删除的对象。这是一个悬空的参考。因此,程序具有未定义的行为。

在这种特殊情况下,输出看起来正确只是因为被删除对象占用的内存还没有被覆盖。

【讨论】:

【参考方案2】:

您正在返回对局部变量的引用。当函数返回并且您的引用悬空时,该变量就会消失。在返回指向已死对象的引用后,使用该引用会导致未定义的行为。

fu& fub() 
    fu a;
    fu& re = a;
    return a;
    // a is dead now

您可以通过编译器警告轻松检测到它,例如-Wall 在 g++ 上。

直播Godbolt。

【讨论】:

以上是关于c++中的引用范围是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式中方括号“[]”内的浮点范围是啥意思? [复制]

不同范围内的 C++ 对象引用

C++ 中命名空间别名的范围是啥?

请问C++ 中定义范围最大的 是啥 ???

在 C++ 中,阴影变量名称的范围解析(“优先顺序”)是啥?

c++ 宏重定义的范围是啥?