[英]C++ const lvalue references
假设我有:
A GenerateA();
这是否意味着它应该有效:B(GenerateA())?
即,const ref是否意味着没有生成A()返回的A副本完成? 这是否意味着只要B存在,返回的临时范围就会延长?
编辑:注释中的插件问题:如果左值是一个常数A&?是否可以将A&从GenerateA()返回到本地A.
谢谢!
如果A
是不可复制的,则函数A GenerateA()
无效,因为按值返回需要创建副本。
如果函数返回引用(即A &GenerateA()
)并且引用是本地创建的A
对象,则函数退出后它将变为无效。 C ++没有任何形式的垃圾收集,因此只要它在使用中就无法“延长”对象的生命周期。
正如其他人已经说过的那样,如果A
不可复制,则A GenerateA()
无法编译。
关于const ref:no,临时的生命周期不会延长到B的生命周期。标准[12.2.5]规定:
绑定到构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定将持续存在,直到构造函数退出。 [...]函数返回语句(6.6.3)中返回值的临时绑定将持续存在,直到函数退出。
所以,是的,临时的生命周期的扩展存在于某些情境中(并且有时非常有用: 请参阅本文 ),但不是在您提供的那个中。
关于你的上一个问题,从GenerateA()
返回对局部变量的引用是不合法的(并且将结果绑定到const引用将没有任何帮助)。
是和否。
是的,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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.