按引用传递的vector在函数内修改后主作用域未生效问题排查
问题原因
你的猜测完全正确,问题和vector的传递逻辑无关,出在范围for循环的取值方式上:
- 你给
generate_randomheightmap传递vector的左值引用是正确的,函数操作的确实是main作用域里的原vector对象,没有发生vector整体拷贝。 - 但你写的循环
for (glm::vec3 vertex : base)中,每次迭代都会将vector内的glm::vec3元素按值拷贝到临时变量vertex中,后续你修改的vertex.y都是临时副本的值,修改结果不会写回原vector的对应元素。你在循环内打印的是临时副本的计算结果,所以看起来数值正确,循环结束后临时变量销毁,原vector元素没有任何改动,回到main作用域打印自然还是初始的0值。
解决方法
不需要把元素改成指针,只要把循环变量声明为引用即可,修改后代码如下:
void generate_randomheightmap(std::vector<glm::vec3>& base, uint32_t layers){ for (glm::vec3& vertex : base){ // 此处添加&取元素引用,不再产生拷贝 vertex.y += vertex.x * vertex.z; } }
这样每次迭代拿到的是vector内元素的左值引用,修改会直接作用到原元素上,main作用域里就能读到修改后的高度值了。
内容的提问来源于stack exchange,提问作者Comma
相关产品推荐
相关产品推荐

