C++函数返回值的作用域和引用

4

最近我在学习C++,对下面的情况有一些疑问。

void function_a(const int &i){
  //using i to do something
}

int function_b(){
  return 1;
}

好的,如果我要调用...

function_a(function_b());

有没有可能 function_a 从它的参数中读取脏引用?

感谢你的时间。


5
临时变量的生命周期只能在创建它们的表达式结束时才终止。function_b()的结果是一个临时变量,并将持续到语句结束。(function_a可以随意使用它。) - GManNickG
4个回答

4

不会失败。由function_b返回的临时对象保证至少在语句结束前一直存在。


2

在这种情况下,编译器将生成一个未命名的临时值,其引用将传递给 function_a。您的代码大致相当于:

int temporary = function_b();
function_a(temporary);
< p > 临时的作用范围仅限于调用function_a()语句的结束(这对于整数来说无关紧要,但可能决定更复杂对象的析构函数何时被调用)。


这是真的吗?我一直以为return 1会返回一个不可变的左值常量。 - Delan Azabani
@Delan Azabani:原始问题已更新,包括 const - Greg Hewgill
@Delan Azabani:int foo();实际上是一个rvalue表达式(r而不是l)。 - David Rodríguez - dribeas
真的吗?这对我来说出乎意料,但我猜我们每天都在学到新东西 😉 - Delan Azabani

2
您需要按照以下方式编写。

'i'无法绑定到从'function_b'返回的临时对象上。这里没有关于脏引用的问题,因为这里涉及一个“临时”的东西,而不是对函数本地变量的引用(一旦“function_b”返回,它就会超出范围)

void function_a(int const &i){ 
  //using i to do something 
} 

int function_b(){ 
  return 1; 
}

int main(){
   function_a(function_b()); 
}

谢谢您的提醒。 在 function_a 的作用域内,变量 'i' 的临时性是否安全? - Code Keeper
是的,临时变量在完整表达式之前是安全的。function_a(function_b()); - Chubsdad

0
问题并不重要。这种类型的操作无法编译。
错误 C2664:'function_a':无法将参数 1 从 'int' 转换为 'int &'。

对不起,我忘记了函数_a参数中的const。 - Code Keeper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接