为返回对非引用类型的引用的函数赋值



我遇到了一些以前从未见过的东西,正在努力理解它。

如果我有一个函数返回对某个对象的引用,那么当我调用该函数时,似乎可以将返回的引用分配给声明为对类型的引用的变量,或声明为类型本身的变量,而不会发生任何变化。

这里有一个基本的例子来演示我所说的:

int size = 150;
std::vector<int> v1(size);
void init(){
for(int i = 0; i < size; ++i){
v1[i] = i;
}
}
std::vector<int>& foo(){
return v1;
}
int main(){
init();
std::vector<int> v2 = foo();
std::vector<int>& v3 = foo();
for(int i = 0; i < size; ++i){
std::cout<<v2[i]<<" ";
}
std::cout<<"n";
for(int i = 0; i < size; ++i){
std::cout<<v3[i]<<" ";
}
std::cout<<"n";
return 0;
}

有人能向我解释一下v2v3是如何被分配相同的功能的吗?

我很不好意思说,老实说,我本以为其中一个甚至不会编译。我已经注意到,更改v3也会更改v1的内容,但更改v2v1没有任何作用,所以当一个比另一个更可取时,这对我来说是有意义的。然而,我很难调和这两项任务都有效的事实。

这是怎么回事?

std::vector<int> v2 = foo();
std::vector<int>& v3 = foo();

v2是v1(新存储器位置(的副本,而v3是v1(相同存储器位置(的参考

这意味着v1的地址(&v1(和v2的地址(amp;v2(不相同。然而;v1==&v3

因此,当对v2的元素进行更改时,v1将不会被更改。

但是,对v3的元素进行更改将更改v1。

为什么??因为他们都">";到内存中的相同位置。

最新更新