通过引用返回已销毁的局部变量的成员

时间:2014-12-30 20:57:07

标签: c++ function reference

有人可以解释这是否合适?

#include <iostream>
#include <vector>

struct A {
    std::vector<int> numbers;
    ~A() {std::cout << "A destroyed.\n";}
    const std::vector<int>& getNumbers() const {return numbers;}
    std::vector<int> getNumbersByValue() const {return numbers;}
};

std::vector<int> foo() {
    A a;
    a.numbers = {1,2,3,4,5};
//  return a.getNumbersByValue();  // This works of course.
    return a.getNumbers();  // Is this line wrong?
}

void useVector(std::vector<int>& v) {
    for (int i = 6; i <=10; i++)
    v.push_back(i);
}

int main() {
    auto v = foo();  // A destroyed.
    for (int x : v) std::cout << x << ' ';  // 1 2 3 4 5
    std::cout << '\n';

    useVector(v);
    for (int x : v) std::cout << x << ' ';  // 1 2 3 4 5 6 7 8 9 10
}

由于a在foo()中被销毁,所以a.numbers也被销毁了,对吧?如果foo()使用A::getNumbersByValue()返回a.numbers的副本,那么一切都很好。但上面我使用getNumbers(),它通过引用返回它。 foo()结束后,向量仍然存在。所以我将向量传递给函数useVector以查看它是否仍然存在,并且确实存在。那么一切都好吗?

1 个答案:

答案 0 :(得分:3)

由于foo按值返回其返回值(而不是按引用),foo会生成要返回的向量的副本。它从getNumbers返回的引用中复制,作为返回的一部分,然后它会破坏局部变量a,所以当它复制时,引用是仍然有效。

所以这段代码很好。