gpt4 book ai didi

C++ 返回引用实际上返回垃圾值

转载 作者:行者123 更新时间:2023-12-04 07:28:53 29 4
gpt4 key购买 nike

我正在学习具有稀缺 C++ 背景的 OpenGL。请参阅下面的代码片段,我尽可能将我的问题最小化:

#include <glm/glm.hpp>

class TestObj
{
private:
glm::mat4 t;

public:
TestObj()
{
t = glm::mat4(1);
}

const glm::mat4& GetT()
{
return t;
}

const glm::vec3& GetPos()
{
return GetT()[3];
}
};

int main(void)
{
TestObj o;

const auto& w1 = o.GetT()[3];
const auto& w2 = o.GetPos();

std::cout << "w1: " << w1.x << " " << w1.y << " " << w1.z << std::endl;
std::cout << "w2: " << w2.x << " " << w2.y << " " << w2.z << "\n" << std::endl;

return 1;
}

如您所见, GetT()[3]GetPos()实现相同,但运行此代码输出:
w1: 0 0 0
w2: 4.59149e-41 1.4013e-45 0
w2来自 GetPos()返回垃圾值。
但是,当我更改 GetPos() 的返回类型时至 const glm::vec4& ,它运行良好,没有返回垃圾值。 operator[]glm::mat4返回 const glm::vec4& ,当然还有从 glm::vec4 实现的隐式转换至 glm::vec3 ,所以在类型转换过程中不需要出错。
我做错了吗?有什么不好的地方?

最佳答案

正如您所指出的,GetT()[3]glm::vec4 ,所以需要转换得到 glm::vec3 .
所以你的代码大部分相当于

const glm::vec3& GetPos()
{
const glm::vec4& vec4 = GetT()[3];
glm::vec3 vec3{vec4}; // Conversion
return vec3;
}
返回悬空指针。

关于C++ 返回引用实际上返回垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68063726/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com