9

假设我有:

  • 不可复制的 A 类
  • 类 B 作为成员, const A& a (并在其构造函数中获取 A 并将其设置在其初始化列表中)
  • 一个函数A GenerateA();

这是否意味着这样做应该是有效的: B(GenerateA()) ?

即, const ref 是否意味着 generateA() 返回的 A 的副本没有完成?这是否意味着只要 B 存在,返回的临时范围就会扩展?

编辑:评论中的附加问题:如果左值是 const A&,将 A& 从 GenerateA() 返回到本地 A 是否可以接受?

谢谢!

4

4 回答 4

4

如果A是不可复制的,则该函数A GenerateA()无效,因为按值返回需要创建一个副本。

如果函数返回一个引用(即A &GenerateA())并且该引用指向本地创建的A对象,则该函数一退出它就变得无效。C++ 没有任何形式的垃圾回收,因此只要对象在使用中,就无法“延长”对象的生命周期。

于 2010-11-10T04:54:20.470 回答
3

正如其他人已经说过的,A GenerateA()如果不可复制,则无法编译A

关于 const ref :不,临时的生命周期不会延长到 B 的生命周期。标准 [12.2.5] 规定:

临时绑定到构造函数的 ctor-initializer (12.6.2) 中的引用成员将持续存在,直到构造函数退出。[...] 函数返回语句(6.6.3)中返回值的临时绑定一直存在,直到函数退出。

所以是的,在某些情况下存在临时生命周期的延长(并且有时真的很有用:请参阅这篇文章),但在您介绍的情况中不存在。

关于您的最后一个问题,返回对局部变量的引用是不合法的GenerateA()(并且将结果绑定到 const 引用不会有任何帮助)。

于 2010-11-10T07:24:01.800 回答
0

是和否。

是的,const 引用将绑定到临时变量。不,作为类成员的 const 引用不会像具有自动持续时间的 const 引用那样延长生命周期。

于 2010-11-10T04:51:21.283 回答
0

这是一个例子

#include <iostream>
using namespace std;

int& GenX(bool reset)
{
    static int* x = new int;
    *x = 100;
    if (reset)
    {
        delete x;
        x = new int;
        *x = 200;
    }
    return *x;
}

class YStore
{
public:
    YStore(int& x);
    int& getX() { return my_x; }
private:
    int& my_x;
};

YStore::YStore(int& x)
 : my_x(x)
{
}

int main()
{
    YStore Y(GenX(false));
    cout << "X: " << Y.getX() << endl;
    GenX(true); // side-effect in Y
    cout << "X: " << Y.getX() << endl;
    return 0;
}

输出:

X: 100
X: 200
于 2010-11-10T05:03:27.183 回答