是否返回对类定义行为中的指针的引用?

P45*_*ent 1 c++

考虑

#include <iostream>

struct Foo
{
    int* n;
    Foo(){n = new int{};}
    ~Foo(){delete n;}
    int& get()
    {
        int* m = n;
        return *m;
    } 
};

int main()
{
    Foo f;
    std::cout << f.get();
}
Run Code Online (Sandbox Code Playgroud)

这是管理指针的类的简化版本,并具有返回对取消引用的指针的引用的方法。

这是定义的行为吗?

use*_*570 7

这是定义的行为吗?

是的,给定的程序格式良好。您将返回一个非常量左值引用,该引用引用指针n和指向的动态分配的整数m。调用后整数对象仍然存在f.get()。也就是说,它不是函数局部变量。


另请注意,仅返回对潜在局部变量的引用本身并不是未定义的行为。只是,如果您要将返回的引用(又名悬空引用)用于不再存在的局部变量,那么我们将得到 UB。