有人可以解释这是否合适?
#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
以查看它是否仍然存在,并且确实存在。那么一切都好吗?
答案 0 :(得分:3)
由于foo
按值返回其返回值(而不是按引用),foo
会生成要返回的向量的副本。它从getNumbers
返回的引用中复制,作为返回的一部分,然后它会破坏局部变量a
,所以当它复制时,引用是仍然有效。
所以这段代码很好。