首页 > 解决方案 > 从以 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!我有哪些选择?超载?

标签: c++

解决方案


你不能有那个签名

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 在类型中具有额外的生命周期,这会强制执行更多的假设:)))。


推荐阅读