C ++ const左值引用

假设我有: A类不可复制 作为成员的B级,const A& a(并在其构造函数中获取A并将其设置在其初始化列表中) 功能
A GenerateA();
这是否意味着它应该是有效的: B(GenerateA()) ? 即,const ref是否表示没有生成A()返回的A的副本?这是否意味着只要B存在,返回的临时范围就会延长? 编辑:评论中的插件问题: 返回A& A是否可以接受从GenerateA()到本地A,如果左值是const A&? 谢谢!     
已邀请:
正如其他人已经说过的那样,如果
A
不可复制,则
A GenerateA()
无法编译。 关于const ref:no,临时的生命周期不会延长到B的生命周期。标准[12.2.5]规定:   绑定到构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定将持续存在,直到构造函数退出。 [...]函数返回语句(6.6.3)中返回值的临时绑定将持续存在,直到函数退出。 所以,是的,临时的生命周期的扩展存在于某些情境中(并且有时非常有用:请参阅本文),但不是在您提供的那个中。 关于你的上一个问题,从
GenerateA()
返回对局部变量的引用是不合法的(并且将结果绑定到const引用将没有任何帮助)。     
如果
A
是不可复制的,则函数
A GenerateA()
无效,因为按值返回需要创建副本。 如果函数返回一个引用(即
A &GenerateA()
)并且引用是本地创建的
A
对象,则一旦函数退出它就会变为无效。 C ++没有任何形式的垃圾收集,因此只要它在使用中就无法“延长”对象的生命周期。     
是和否。 是的,const引用将绑定到临时变量。不,作为类成员的const引用不会像const引用自动持续时间那样延长生命周期。     
这是一个例子:
#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
    

要回复问题请先登录注册