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

标签 c++

我正在学习 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::vec4glm::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/

相关文章:

c++ - 重新声明错误

c++ - 更新对象的属性时遇到问题?

c++ - 在 C++ 中使用组合进行对象实例化计算

c++ - 为什么用 C++ 编译文件系统代码会返回这个错误?

c++ - 为什么源文件的名称会影响编译?

c++ - enum 和 enum class 的区别?

c++ - 将 C++ 分配给映射迭代器时出现类型错误

c++ - C++ 中逗号运算符的语法使用

c++ - RHEL 6.0 两段相似的代码 : One Compiles One Does Not

c++ - 在QT gui上将.csv文件导入到sqlite3数据库表