Answers:
任何和所有类型的“字符串引用”和“数组引用”建议的目的都是为了避免复制已经在其他地方拥有并且仅需要非变异视图的数据。该string_view
问题是这样的一个建议; 还有更早的被称为string_ref
和array_ref
。
这个想法始终是存储一对指向第一个元素的指针和一些现有数据数组或字符串的大小。
这样的视图句柄类可以按值廉价地传递,并且可以提供廉价的子字符串操作(可以通过简单的指针增量和大小调整来实现)。
字符串的许多用法并不需要实际拥有这些字符串,并且所讨论的字符串通常已经由其他人拥有。因此,通过避免不必要的副本(考虑可以节省的所有分配和例外),确实有提高效率的潜力。
原始的C字符串遭受的问题是null终止符是字符串API的一部分,因此,如果不更改基础字符串(la strtok
),就无法轻松创建子字符串。在C ++中,可以通过单独存储长度并将指针和大小包装到一个类中来轻松解决。
我可以想到的一个主要障碍和与C ++标准库哲学的不同之处在于,此类“引用视图”类具有与其余标准库完全不同的所有权语义。基本上,标准库中的所有其他内容都是无条件安全和正确的(如果可以编译,则是正确的)。对于这样的引用类,这不再是事实。程序的正确性取决于使用这些类的环境代码。所以这很难检查和教导。
reference_wrapper
,不是吗?
string_view
。(我并不是说您永远不能编写残破的代码。只是残破是本地的。)
std::range
从中boost::iterator_range
接受-IMO比string_view的想法更好