const int*&类型变量可做哪些修改?传入int*参数时能否修改*y的值
核心问题解答
1. const int*&参数传入int*变量的修改问题
你给出的DoWork代码首先就无法通过编译,涉及两个约束:
编译失败的两个原因
- 首先参数
const int* &n的含义是:n是一个指向const int的指针的左值引用。这里const修饰的是指针指向的内容,也就是说你不允许通过*n修改它指向的int值,所以*n = *n * 2这行直接触发语法错误。 - 其次你传入的参数是
int*类型的a,int*转const int*会生成临时的const int*对象,而C++规定非常量左值引用不能绑定临时对象,所以连DoWork(a)这个调用本身都无法通过编译。
2. PCL代码中加了const的参数为什么能修改点云内容
你看到的const pcl::PointCloud<pcl::PointXYZRGB>::Ptr& cloud参数,核心要先搞清楚::Ptr的本质:它是PCL封装的智能指针,等价于std::shared_ptr<pcl::PointCloud<pcl::PointXYZRGB>>。
这个const修饰的是谁?
从右往左读参数类型就不会搞混:
- 末尾的
&说明参数是引用,是对外部传入的智能指针变量起别名 - 前面的
const修饰的是智能指针本身,不是它指向的点云对象
也就是说这个约束只要求:你不能在函数内部让cloud这个智能指针指向新的其他点云对象(不能写cloud = 新的智能指针这种代码),但完全允许修改cloud指向的点云对象的内容。
代码里的修改为什么合法?
你贴的代码里的修改操作:
proj.filter(*seg_cloud):修改seg_cloud指向的点云对象的存储内容,没有修改seg_cloud这个智能指针本身的指向extract_indices.filter(*cloud):修改cloud指向的点云对象的存储内容,没有修改cloud这个智能指针本身的指向
完全符合const的约束,所以可以正常运行,自然会同步修改外部temp_cloud、seg_cloud指向的点云数据。
通用规则总结
关于指针/引用加const的修饰规则,只要记住const管它后面紧邻的类型:
const T* ptr/T const * ptr:const后面紧邻的是T,所以修饰指向的T对象,不能通过ptr修改*ptr的内容T* const ptr:const后面紧邻的是ptr,所以修饰指针本身,ptr不能指向其他地址,但可以修改*ptr的内容- 智能指针的const修饰也是同理:
const Ptr& ptr的const修饰的是智能指针本身,不影响它指向的对象的修改权限
内容的提问来源于stack exchange,提问作者Shivam Siuu
相关产品推荐
相关产品推荐

