c++ - 从以 const 范围作为参数的函数返回的值
问题描述
假设我有一个功能
auto found = find(first, last, condition);
这个find应该能保证不从头到尾修改。
所以像
auto find(const T* first, const T* last, Comp c = less<>);
导致返回 const T 或 const T*。
所以
int arr[] = {3, 4};
std::vector v(arr, arr +2);
int* found = find(v.begin(), v.end());
** error found is non-const.
我要修改 *found!我有哪些选择?超载?
解决方案
你不能有那个签名
int* my_find(const int* begin, const int* end);
(表示您的方法不会修改范围)没有 (dangerous) /*const_*/cast
。
该签名将允许
const int arr[] = {0, 1, 2, 3};
*my_find(std::cbegin(arr), std::cend(arr)) = 42; // Modifying const object. -> UB
在呼叫现场,可能会做所有的演员:
// const int* my_find(const int*, const int*);
int arr[] = {0, 1, 2, 3};
auto it = const_cast<int*>(my_find(std::cbegin(arr), std::cend(arr)));
这假设返回的指针在范围内,而不是外部 const 对象上的指针(签名不能确保(Rust 在类型中具有额外的生命周期,这会强制执行更多的假设:)))。
推荐阅读
- java - 如何将一对整数的列表添加为 Map 中的值,其中键作为该对中的第一个值 - Java
- javascript - 为什么它会返回所有的小兵,而不仅仅是那些具有“升级者”角色的小兵?
- node.js - ExpressJs Uncaught TypeError:无法读取未定义 view.js 的属性“原型”
- android - 清单合并失败:uses-sdk:minSdkVersion 19 不能小于库中声明的版本 21
- amazon-web-services - AWS Lambda:如何为同一路径设置多个处理程序?
- javascript - 围绕折线图中的一个点画一条线
- python - 深拷贝与列表理解
- django - 如何更新 Django QuerySet,使其不返回缓存数据?
- python - 在 google colab 中将 .mat 文件转换为图像
- gcc - 如何在使用 g++ 编译时修复“ld: library not found for -lubsan”?