C++成员函数如何返回存储非常量元素vector的const版本
实现方法
你不需要通过拷贝构造std::vector<const int>的方式实现只读返回——这种写法不仅有不必要的拷贝开销,std::vector<const T>本身也不符合C++容器的元素类型要求(const元素无法支持容器需要的赋值操作,在很多旧编译器下甚至无法正常编译)。
C++容器的const限定会自动传导到元素访问权限,只要返回内部存储的只读视图/const引用,调用方就无法修改元素,全程零拷贝,有三种常用实现:
- 返回const引用(所有C++版本通用,写法最简单)
const std::vector<int>& ExampleClass::get_numbers() const { return n_; }
返回值是成员vector的const引用,没有任何拷贝,调用方通过它访问到的元素都是const int&类型,无法修改。缺点是会暴露内部用vector存储的实现细节,后续如果更换内部存储容器,接口需要同步调整。
- 返回const元素的span(C++20及以上版本推荐,解耦性最优)
#include <span> std::span<const int> ExampleClass::get_numbers() const { return n_; }
std::span<const int>是轻量级只读视图,内部仅存储数据指针和长度,无拷贝开销,支持下标访问、范围for遍历等和vector几乎一致的操作,同时不会暴露内部存储的具体容器类型,后续更换内部存储结构时只要能兼容span转换,接口无需改动,是现代C++的首选写法。
- 返回const迭代器对(C++20以下版本兼容方案)
如果项目使用的C++版本不支持std::span,可以直接返回容器的const起止迭代器:
std::pair<std::vector<int>::const_iterator, std::vector<int>::const_iterator> ExampleClass::get_numbers() const { return {n_.cbegin(), n_.cend()}; }
调用方通过这对迭代器遍历拿到的元素都是const只读的,同样没有拷贝开销。
内容的提问来源于stack exchange,提问作者CraigDavid
相关产品推荐
相关产品推荐

