我正在学习 OpenGL,但 C++ 背景很少。请参阅下面的代码片段,我尽可能地最小化了我的问题:
#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
来自 GetPos()
的 w2
返回垃圾值。
但是,当我将 GetPos()
的返回类型更改为 const glm::vec4&
时,它工作正常,没有返回垃圾值.
operator[]
for 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/