从函数返回临时对象的引用
Returning reference of a temporary object from a function
考虑以下代码 -
#include <iostream>
#include <stdio.h>
const int & retRef() {
return 6;
}
int main()
{
const int& k = retRef();
printf("Value: %d\n", k);
printf("Address: %p\n", &k);
printf("Value: %d\n", k);
return 0;
}
输出为-
Value: 6
Address: 0x7ffd45bf544c
Value: 32692
为什么打印变量地址后值变了k
?如果我将 const int& k = retRef()
行替换为 const int& k = 6;
,则输出符合预期。
为什么会出现这种不同的行为?提前致谢
您正在返回对临时对象的引用,这将导致未定义的行为。一旦函数 returns,该对象将不可用。
n4659 - § 15.2:
(6.2) — The lifetime of a temporary bound to the returned value in a function return
statement (9.6.3) is not extended; the temporary is destroyed at the end of the full-expression in the return
statement.
您的代码有未定义的行为;您正在尝试绑定 temporary int
(由文字 6
构造)以引用为 return 值,但临时文件将立即被销毁 retRef()
总是 return 是悬空引用,并且 k
也是悬空引用。对它的任何取消引用都会导致 UB。
Whenever a reference is bound to a temporary or to a subobject thereof, the lifetime of the temporary is extended to match the lifetime of the reference, with the following exceptions:
- a temporary bound to a
return
value of a function in a return statement is not extended: it is destroyed immediately at the end of the return expression. Such function always returns a dangling reference.
另一方面,const int& k = 6;
工作正常,因为如上所述,临时文件的生命周期延长到 k
的生命周期。
在函数 retRef 中,您将返回对局部变量的引用。
退出函数时,函数内部的对象将被销毁,所有对它的引用都将失效。使用 link 将进一步导致未定义的行为...
const int & retRef()
{
return 6;
}
考虑以下代码 -
#include <iostream>
#include <stdio.h>
const int & retRef() {
return 6;
}
int main()
{
const int& k = retRef();
printf("Value: %d\n", k);
printf("Address: %p\n", &k);
printf("Value: %d\n", k);
return 0;
}
输出为-
Value: 6
Address: 0x7ffd45bf544c
Value: 32692
为什么打印变量地址后值变了k
?如果我将 const int& k = retRef()
行替换为 const int& k = 6;
,则输出符合预期。
为什么会出现这种不同的行为?提前致谢
您正在返回对临时对象的引用,这将导致未定义的行为。一旦函数 returns,该对象将不可用。
n4659 - § 15.2:
(6.2) — The lifetime of a temporary bound to the returned value in a function
return
statement (9.6.3) is not extended; the temporary is destroyed at the end of the full-expression in thereturn
statement.
您的代码有未定义的行为;您正在尝试绑定 temporary int
(由文字 6
构造)以引用为 return 值,但临时文件将立即被销毁 retRef()
总是 return 是悬空引用,并且 k
也是悬空引用。对它的任何取消引用都会导致 UB。
Whenever a reference is bound to a temporary or to a subobject thereof, the lifetime of the temporary is extended to match the lifetime of the reference, with the following exceptions:
- a temporary bound to a
return
value of a function in a return statement is not extended: it is destroyed immediately at the end of the return expression. Such function always returns a dangling reference.
另一方面,const int& k = 6;
工作正常,因为如上所述,临时文件的生命周期延长到 k
的生命周期。
在函数 retRef 中,您将返回对局部变量的引用。 退出函数时,函数内部的对象将被销毁,所有对它的引用都将失效。使用 link 将进一步导致未定义的行为...
const int & retRef()
{
return 6;
}