最近我在学习C++,对下面的情况有一些疑问。
void function_a(const int &i){
//using i to do something
}
int function_b(){
return 1;
}
好的,如果我要调用...
function_a(function_b());
有没有可能 function_a 从它的参数中读取脏引用?
感谢你的时间。
最近我在学习C++,对下面的情况有一些疑问。
void function_a(const int &i){
//using i to do something
}
int function_b(){
return 1;
}
好的,如果我要调用...
function_a(function_b());
有没有可能 function_a 从它的参数中读取脏引用?
感谢你的时间。
不会失败。由function_b
返回的临时对象保证至少在语句结束前一直存在。
在这种情况下,编译器将生成一个未命名的临时值,其引用将传递给 function_a
。您的代码大致相当于:
int temporary = function_b();
function_a(temporary);
< p > 临时
的作用范围仅限于调用function_a()
语句的结束(这对于整数来说无关紧要,但可能决定更复杂对象的析构函数何时被调用)。
return 1
会返回一个不可变的左值常量。 - Delan Azabaniconst
。 - Greg Hewgillint foo();
实际上是一个rvalue表达式(r而不是l)。 - David Rodríguez - dribeas'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_b()
的结果是一个临时变量,并将持续到语句结束。(function_a
可以随意使用它。) - GManNickG