我有以下代码:
#include <iostream>
using namespace std;
void func1(int &&val) {
// statements
}
int main() {
const int &i = 5; //line1
func1(4);// line 2
return 0;
}第1行中I的生存期是否与main()的生存期或作用域相同?第2行中整数字面值4的生存期如何,它的生存期是否也与main()相同?
发布于 2022-01-10 16:23:32
在第1行中,从prvalue 5实现的临时对象的生存期被扩展到绑定到的引用的生存期。因此,暂时的生活直到main的结束,在那里i的范围结束。
这是一般规则:临时是生存期--延长到绑定到它的第一个引用的生存期。
这个规则有几个例外,即当引用是函数的返回值时,当使用C++20括号大小的聚合初始化和在new表达式中时,它不适用。在这些情况下,临时生命只到包含它的完整表达式结束为止,这通常比引用的生存期短。
此外,必须确保在创建临时绑定和引用绑定之间仅对引用对象的表达式执行某些操作。有关完整列表,请参见优先选择。
而且,当我说第一次引用的时候,我是认真的。如果要将临时对象传递给另一个对象的构造函数,则构造函数参数中的引用已经计算在内。通过这种方式,通常不能通过在类的引用成员中“存储”对象来延长对象的生存期。
在第2行中,以一种稍微不同的方式,它是一个例外。如果所讨论的引用是函数调用中的函数参数,则临时生命一直持续到函数调用的完整表达式的末尾,因此直到行尾。在这种情况下,临时生命比引用长。
https://stackoverflow.com/questions/70655529
复制相似问题