返回的 const 引用究竟何时被销毁?
When exactly does a returned const reference get destroyed?
假设我有一个函数return通过常量引用计算一个整数:
const int& five()
{
return 5;
}
我知道我不应该 return 引用值(const
或其他)哪个作用域仅在函数内部,但我只是好奇。
是否可以像这样将函数return用作左值?
int sum = 4 + five();
在函数范围内创建的对象在该函数 returns 时被销毁。返回的引用在时间控制returns到调用站点时不再有效。
这意味着您问题中的函数定义无效。它 returns 一个对象的引用,当任何东西有机会使用返回的引用时,该对象将消失。
值得一提的是,value 返回的临时对象会一直存在到完整表达式的末尾。所以对于下面的代码:
struct Test
{
Test() { std::cout << "Test constructed\n"; }
~Test() { std::cout << "Test destroyed\n"; }
};
std::ostream& operator<<(std::ostream& os, const Test& t) {
os << "Test output";
return os;
}
Test func() {
return {};
}
int main() {
std::cout << func() << "\nAfter\n";
}
输出将是:
Test constructed
Test output
After
Test destroyed
因为 func
返回的 Test
对象一直存在到完整的 cout
表达式结束。
假设我有一个函数return通过常量引用计算一个整数:
const int& five()
{
return 5;
}
我知道我不应该 return 引用值(const
或其他)哪个作用域仅在函数内部,但我只是好奇。
是否可以像这样将函数return用作左值?
int sum = 4 + five();
在函数范围内创建的对象在该函数 returns 时被销毁。返回的引用在时间控制returns到调用站点时不再有效。
这意味着您问题中的函数定义无效。它 returns 一个对象的引用,当任何东西有机会使用返回的引用时,该对象将消失。
值得一提的是,value 返回的临时对象会一直存在到完整表达式的末尾。所以对于下面的代码:
struct Test
{
Test() { std::cout << "Test constructed\n"; }
~Test() { std::cout << "Test destroyed\n"; }
};
std::ostream& operator<<(std::ostream& os, const Test& t) {
os << "Test output";
return os;
}
Test func() {
return {};
}
int main() {
std::cout << func() << "\nAfter\n";
}
输出将是:
Test constructed Test output After Test destroyed
因为 func
返回的 Test
对象一直存在到完整的 cout
表达式结束。