c++ - 我们可以获取子字符串的 const ref 吗?
问题描述
我有一个类,其中包含一个字符串作为私有成员。该类具有公共成员函数,它们都将 const ref 返回到 std::wstring。
返回的所有 const-ref 字符串都是私有成员的子字符串。
我可以将每个子字符串存储为成员,然后将 const refs 返回给这些成员,但这不是最佳的,因为它会复制内存。
假设我确实存储了足够的内存来知道每个子字符串的开始和结束索引。
如何在不复制任何成员字符串的情况下实现上述类?
解决方案
这是不合法的,它不会为您节省任何东西。 std::string::substr
按值返回。这意味着无论您如何返回它,它都会从类成员中复制数据。当您返回对它的引用时,您将返回对临时本地对象的引用。const 引用生命周期扩展规则在这里不起作用,您在呼叫站点留下的是一个悬空引用。
您可以做的只是按值返回。默认情况下,这将导致移动,编译器可以很容易地通过将临时构造直接省略到调用站点中的对象中来优化它。
另一种选择是拥有一个std::string_view
成员,并从中返回子字符串。这样做只需要复制一个指针和一个整数,所以它会非常快。
推荐阅读
- c# - C# - 循环一次在数组的所有成员上执行代码,而不是一次迭代一个
- java - 带有 Maven Wrapper 的 Java 17 导致无法识别的 VM 选项“MaxPermSize=512m”
- r - ors_directions() curl::curl_fetch_memory 中的错误
- plsql - 如何在 OBIEE 中仅显示最高学历
- ios - Xcode 13(“产品”不明确)
- python - 我收到未捕获的错误。'latin-1' 编解码器无法对位置 7 中的字符 '\\ufffd' 进行编码:python3 中的序数不在范围内(256)
- post - 验证 POST 操作中的参数长度(Azure API 管理)
- visual-studio - 如何为将出现在 SSIS 工具箱中的控制流和数据流创建自定义任务
- javascript - 改变jQuery附加段落Javascript的innerHTML
- ng-bootstrap - 角引导分页大部分页码链接没有出现在屏幕上