返回的const引用到底何时被销毁?

时间:2019-06-12 07:41:27

标签: c++ pass-by-reference

让我们说我有一个通过常量引用返回整数的函数:

const int& five()
{
    return 5;
}

我知道我不应该通过引用(const或其他方式)返回一个值,该范围仅在函数内部,但是我很好奇。

是否可以将函数return用作这样的左值?

int sum = 4 + five();

1 个答案:

答案 0 :(得分:2)

当函数返回时,在函数范围内创建的对象将被销毁。当控件返回到呼叫站点时,返回的引用不再有效。

这意味着您问题中的函数定义无效。它返回对对象的引用,当任何东西都有机会使用返回的引用时,该对象将消失。


值得一提的是,由 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

由于Test返回的func对象一直存在到整个cout表达式的末尾。