首页 > 解决方案 > 我们可以获取子字符串的 const ref 吗?

问题描述

我有一个类,其中包含一个字符串作为私有成员。该类具有公共成员函数,它们都将 const ref 返回到 std::wstring。

返回的所有 const-ref 字符串都是私有成员的子字符串。

我可以将每个子字符串存储为成员,然后将 const refs 返回给这些成员,但这不是最佳的,因为它会复制内存。

假设我确实存储了足够的内存来知道每个子字符串的开始和结束索引。

如何在不复制任何成员字符串的情况下实现上述类?

标签: c++c++17stdstringflyweight-pattern

解决方案


这是不合法的,它不会为您节省任何东西。 std::string::substr按值返回。这意味着无论您如何返回它,它都会从类成员中复制数据。当您返回对它的引用时,您将返回对临时本地对象的引用。const 引用生命周期扩展规则在这里不起作用,您在呼叫站点留下的是一个悬空引用。

您可以做的只是按值返回。默认情况下,这将导致移动,编译器可以很容易地通过将临时构造直接省略到调用站点中的对象中来优化它。

另一种选择是拥有一个std::string_view成员,并从中返回子字符串。这样做只需要复制一个指针和一个整数,所以它会非常快。


推荐阅读