为什么 `std::string_view` 不可修改?

问题描述 投票:0回答:1

我开始尝试

std::string_view

它有一个非常丑陋的特点。你不能说:

std::string_view<const char>
std::string_view<char>
喜欢很棒的
std::span

因此,您无法从

std::string
获取可修改的视图并更改某些字符(您可以从
const std::string
获取不可修改的视图)。都不是来自
char*

这有什么原因吗,还是……设计不好?

c++ c++17 language-design string-view
1个回答
0
投票

制作

std::string_view
,或者更具体地说,类模板
std::basic_string_view<T>
可能是一个可变视图被考虑过,但并不重要。 引用提案 N3921:
string_view
:对字符串的非拥有引用,修订版 7

使 basic_string_view 可变

…并使用

basic_string_view<const char>
表示常量情况。常量情况比可变情况更常见,因此它需要成为默认情况。将可变大小写设置为默认值将阻止将字符串文字传递到
string_view
参数中,这将破坏
string_view
的重要用例。在一个有点类似的情况下,LLVM 在 2011 年 2 月定义了一个
ArrayRef
类,直到 2012 年 1 月才发现需要匹配的
MutableArrayRef
他们仍然不需要
StringRef
的可变版本。
造成这种情况的一个可能原因是,大多数需要修改字符串的用途也需要能够更改其长度,而即使通过
string_view
的可变版本也是不可能的。

我们可以使用

typedef basic_string_view<const char> string_view
将不可变情况设为默认情况,同时仍然使用相同的模板支持可变情况。我没有这样做,因为它会使模板的定义变得复杂,而不会显着帮助用户。

总而言之,可变字符串视图会使模板变得复杂,无法更改字符串的长度,并且不是一个足够常见的用例。

显然,C++20 为您提供了

std::span
以获得连续序列的可能可变视图,可以使用它来代替。
std::span
消除了添加某些可变字符串视图的任何动机。

© www.soinside.com 2019 - 2024. All rights reserved.