我们可以使用子字符串的 const ref 吗?
Can we take a const ref of a substring?
我有一个class,其中包含一个字符串作为私有成员。 class 有 public 个成员函数,所有 return 都是对 std::wstring.
的常量引用
所有 returned 的 const-ref 字符串都是私有成员的子字符串。
我可以将每个子字符串存储为成员,然后 return 对这些成员进行 const 引用,但这不是最佳选择,因为它会复制内存。
假设我确实存储了足够的内存来知道每个子字符串的开始和结束索引。
如何在不复制任何成员字符串的情况下实现上述 class?
这是不合法的,也不会为您节省任何东西。 std::string::substr
returns 按值计算。这意味着无论您如何 return 它都会从 class 成员复制数据。当您 return 引用它时,您是 return 对临时本地对象的引用。 const 引用生命周期扩展规则在这里不起作用,您在调用站点剩下的是悬空引用。
您可以做的只是 return 按值。默认情况下,这会导致移动,编译器可以通过将临时构造直接省略到调用站点中的对象中来很容易地优化它。
另一种选择是拥有一个 std::string_view
成员,以及来自该成员的 return 个子字符串。这样做只需要复制一个指针和一个整数,所以速度会很快。
我有一个class,其中包含一个字符串作为私有成员。 class 有 public 个成员函数,所有 return 都是对 std::wstring.
的常量引用所有 returned 的 const-ref 字符串都是私有成员的子字符串。
我可以将每个子字符串存储为成员,然后 return 对这些成员进行 const 引用,但这不是最佳选择,因为它会复制内存。
假设我确实存储了足够的内存来知道每个子字符串的开始和结束索引。
如何在不复制任何成员字符串的情况下实现上述 class?
这是不合法的,也不会为您节省任何东西。 std::string::substr
returns 按值计算。这意味着无论您如何 return 它都会从 class 成员复制数据。当您 return 引用它时,您是 return 对临时本地对象的引用。 const 引用生命周期扩展规则在这里不起作用,您在调用站点剩下的是悬空引用。
您可以做的只是 return 按值。默认情况下,这会导致移动,编译器可以通过将临时构造直接省略到调用站点中的对象中来很容易地优化它。
另一种选择是拥有一个 std::string_view
成员,以及来自该成员的 return 个子字符串。这样做只需要复制一个指针和一个整数,所以速度会很快。