c++ - 使用对(成员)函数返回的对象的引用是否安全甚至可能?
问题描述
我有一个类存储一堆可以在整个程序中更改的值和一个成员函数,它根据这些值计算并返回一个矩阵。
我还有一个函数,它需要一个指向此类矩阵的第一个浮点数的 const 指针。
我不想在某处手动创建本地矩阵。相反,我想同时更新并将其直接从类传递给所述函数。
所以,而不是这个:
glm::mat4 matrix = myClass.calculateMatrix();
functionThatneedsMatrix(&matrix [0][0]);
我可以这样做吗?
functionThatneedsMatrix(&myClass.calculateMatrix()[0][0]);
如果是,该矩阵的范围是什么?
解决方案
一个临时的生命直到创建它的完整表达式结束,所以在你的情况下,从calculateMatrix
生命返回的纯右值直到;
(after functionThatneedsMatrix
returns) 。所以是的,以这种方式使用它是安全的。
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
推荐阅读
- java - 如何使 AspectJ Aspect 在 Gradle 项目中工作?
- java - 如何在 Android 应用程序和 Webots 机器人之间进行通信
- javascript - 缩短 querySelector 和样式更改
- angular - Angular 8 - 访问 ngOnInit 中的元素时无法读取 null 的属性“焦点”
- mysql - MariaDB - 使用前一个 + 常量的值更新所有行
- macos - 缺少依赖项,但应用程序仍在 Mac M1 上运行
- matlab - 在matlab中为boxplot旋转多行xlabels
- java - 当从带有 TransactionManagementType.CONTAINER 的 bean 调用时,在带有 TransactionManagementType.BEAN 的 bean 中开始和提交事务
- java - can't find the null pointer exception
- swift - How do i disable vertical scrolling but enable horizontal scrolling in collectionview swift 4?