我开始尝试
std::string_view
。
它有一个非常丑陋的特点。你不能说:
std::string_view<const char>
和 std::string_view<char>
喜欢很棒的 std::span
。
因此,您无法从
std::string
获取可修改的视图并更改某些字符(您可以从 const std::string
获取不可修改的视图)。都不是来自char*
。
这有什么原因吗,还是……设计不好?
制作
std::string_view
,或者更具体地说,类模板 std::basic_string_view<T>
可能是一个可变视图被考虑过,但并不重要。
引用提案 N3921:string_view
:对字符串的非拥有引用,修订版 7:
使 basic_string_view 可变
…并使用
表示常量情况。常量情况比可变情况更常见,因此它需要成为默认情况。将可变大小写设置为默认值将阻止将字符串文字传递到basic_string_view<const char>
参数中,这将破坏string_view
的重要用例。在一个有点类似的情况下,LLVM 在 2011 年 2 月定义了一个string_view
类,直到 2012 年 1 月才发现需要匹配的ArrayRef
。他们仍然不需要MutableArrayRef
的可变版本。造成这种情况的一个可能原因是,大多数需要修改字符串的用途也需要能够更改其长度,而即使通过StringRef
的可变版本也是不可能的。string_view
我们可以使用
将不可变情况设为默认情况,同时仍然使用相同的模板支持可变情况。我没有这样做,因为它会使模板的定义变得复杂,而不会显着帮助用户。typedef basic_string_view<const char> string_view
总而言之,可变字符串视图会使模板变得复杂,无法更改字符串的长度,并且不是一个足够常见的用例。
显然,C++20 为您提供了
std::span
以获得连续序列的可能可变视图,可以使用它来代替。
std::span
消除了添加某些可变字符串视图的任何动机。