从函数返回const对局部变量的引用

aJ.*_*aJ. 36 c++ reference undefined const-reference

我有一些关于从函数返回对局部变量的引用的问题:

class A {
public:
    A(int xx)
    : x(xx)
    {
        printf("A::A()\n");
    }
};

const A& getA1()
{
    A a(5);
    return a;
}

A& getA2()
{
    A a(5);
    return a;
}

A getA3()
{
    A a(5);
    return a;
}

int main()
{
    const A& newA1 = getA1(); //1
    A& newA2 = getA2(); //2
    A& newA3 = getA3(); //3
}
Run Code Online (Sandbox Code Playgroud)

我的问题是=>

  1. 执行getA1()是否正确?我觉得它是错误的,因为它返回局部变量的地址或临时变量.

  2. main(1,2,3)中的哪些陈述会导致未定义的行为?

  3. const A& newA1 = getA1();做标准的保证,暂时由const引用约束不会被破坏,直到引用超出范围是什么?

Ric*_*den 32

1. getA1()实施是否正确?我觉得这是不正确的,因为它返回本地变量或临时的地址.

唯一的版本getAx()是正确的程序是getA3().无论你以后如何使用它们,其他两个都有不确定的行为.

2.主要(1,2,3)中的哪些陈述会导致未定义的行为?

从某种意义上说,没有一个.对于1和2,未定义的行为是函数体的结果.对于最后一行,newA3应该是编译错误,因为您无法将临时绑定到非const引用.

3. const A& newA1 = getA1();标准保证const 在引用超出范围之前,引用临时约束不会被销毁吗?

不.以下是一个例子:

A const & newConstA3 = getA3 ();
Run Code Online (Sandbox Code Playgroud)

在这里,getA3()返回一个临时值,该临时值的生命周期现在绑定到该对象newConstA3.换句话说,临时将存在,直到newConstA3超出范围.

  • 我认为最后一条语句令人困惑..您的意思是,直到newConstA3超出范围后,临时文件才会被销毁吗? (2认同)

dha*_*rga 5

Q1:是的,这是一个问题,请参阅问题2的答案。

Q2:1和2是未定义的,因为它们引用了getA1和getA2堆栈上的局部变量。这些变量超出了范围,不再可用,更糟糕的是,随着堆栈不断变化,这些变量可能会被覆盖。getA3 可以工作,因为创建了返回值的副本并将其返回给调用者。

问题 3:不存在这样的保证来看到问题 2 的答案。