关于std::vector::push_back(std::move(v[i]))的困惑:修改v2为何不影响v1?
问题解析:为什么修改v2元素不会影响v1?
你的核心误解在于对std::move针对基本类型的行为和vector元素本质的混淆,拆解如下:
std::move对int的作用只是转换值类别,不会转移资源
std::move的本质是把左值(比如v1[0]返回的int&)强制转换为右值引用,但对于int这类无资源的基本数据类型,移动构造/赋值的逻辑和拷贝完全一致——就是把值复制一份,不会让两个变量共享同一块内存。vector
的元素是独立的int对象,不是引用 v2.push_back(std::move(v1[0]))执行时,vector会在自己的内存空间里新建一个int元素,把v1[0]的5复制进去。v1[0]和v2[0]是两块完全独立的内存,修改其中一个自然不会影响另一个。混淆了“引用”和“右值引用”
operator[]返回的是int&(左值引用),std::move把它转成int&&(右值引用),但这只是告诉编译器“这个值可以被移动”,但int没有可转移的资源,所以最终还是拷贝。如果想让v2的元素和v1共享同一份值,你需要用存储引用的容器,比如std::vector<std::reference_wrapper<int>>或者指针容器:
#include <iostream> #include <vector> #include <functional> int main(){ std::vector<int> v1{5}; std::vector<std::reference_wrapper<int>> v2; v2.push_back(v1[0]); v2[0] = 1; std::cout << v1[0] << '\n'; // 输出1 std::cout << v2[0].get() << '\n'; // 输出1 }
内容的提问来源于stack exchange,提问作者starriet 차주녕
相关产品推荐
相关产品推荐

