在 vector::at 返回引用后进行更改

make change after vector::at returns a reference

本文关键字:引用 vector at 返回      更新时间:2023-10-16
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> nums {0,1,2};
vector<int> copy {0};
copy.at(0) = nums.at(0);  // nums.at(0) returns a reference
nums.at(0) = -1;          // why this line doesn't change copy[0]
std::cout << copy.at(0);  // print 0
}

嗨,正如代码所示,看起来更改 nums.at(0( 不会影响 copy.at(0(。copy.at(0) = nums.at(0);是否将复制赋值运算符称为副本? 对我来说,这一行实际上做一个副本是没有意义的,因为copy.at(0)也返回了一个引用。

引用在初始化时绑定。之后,引用引用绑定对象,不能引用其他内容。

也许最好通过一个例子来理解这一点:

int x = 6;
int& x_ref = x;  // bind x_ref to x
int y = 12;
x_ref = y;       // assign the value of y to x

在您的代码中,copy.at(0)确实返回了一个引用,但是您不能将该引用重新绑定到其他内容。相反copy.at(0) = something;会将something分配给copy.at(0)引用的内容。

我完全同意上面的评论,你误解了。 此外,引用必须在声明时初始化, 这可以说明您的情况。

#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> nums {0,1,2};
int& copy = nums.at(0); 
nums.at(0) = -1; 
std::cout <<"copy is"<< copy;  // print -1
}

请注意:这是自找麻烦,一旦向量重新分配或删除元素,引用就会悬空。
另请参阅C++中的引用概念

在线演示