我有一个存储一堆可以在整个程序中更改的值的类,以及一个成员函数,该成员函数根据这些值计算并返回矩阵。
我还有一个函数,需要一个指向此类矩阵的第一个浮点数的const指针。
我不想在某个地方手动创建局部矩阵。相反,我想同时从类直接更新并将其传递给上述函数。
所以,代替这个:
glm::mat4 matrix = myClass.calculateMatrix();
functionThatneedsMatrix(&matrix [0][0]);
我可以这样做吗?
functionThatneedsMatrix(&myClass.calculateMatrix()[0][0]);
如果是的话,那个矩阵的范围是什么?
答案 0 :(得分:2)
一个临时对象生存到创建它的完整表达式的末尾,因此在您的情况下,从calculateMatrix
返回的prvalue生存到;
(在functionThatneedsMatrix
返回之后)。是的,以这种方式使用它是安全的。
functionThatneedsMatrix(&myClass.calculateMatrix()[0][0]) ;
// ^
// |
// temporary lifetime ends here,
// after functionThatneedsMatrix returns
可能的UB情况是如果functionThatneedsMatrix
以在函数调用结束后可以访问的方式返回或存储该指针:
int* p = functionThatneedsMatrix(&myClass.calculateMatrix()[0][0]) ;
// ^
// if it returns the pointer value it received as parameter
// p is a dangling pointer at this time
int a = *p; // Undefined behavior