我们可以接受子字符串的const ref吗?

brb*_*sby 2 c++ stdstring flyweight-pattern c++17

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

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

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

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

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

Nat*_*ica 6

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

但是,您可以做的只是按值返回。默认情况下,这将导致移动,并且编译器可以通过将临时构造直接隐藏在调用站点的对象中来轻松地优化此操作。

另一种选择是拥有一个std::string_view成员,并从中返回子字符串。这样做只会花费您复制一个指针和一个整数的费用,因此它将非常快。