gpt4 book ai didi

c++ - 从一系列字符构建 string_view

转载 作者:行者123 更新时间:2023-12-03 06:49:44 27 4
gpt4 key购买 nike

而一个 span可以从一个范围构建,一个 string_view不能从一系列字符构造。
因此,例如,需要以下代码:

// assume chars_span is a span of chars
std::cout << std::string_view(chars_span.data(), chars_span.size());
// or:
std::cout << std::string_view(chars_span.begin(), chars_span.end());
而不是不支持的更简单的范围语法:
std::cout << std::string_view(chars_span);
是否有原因没有 string_view 的构造函数接受一系列字符,还是只是被忽视或被认为不够重要?

最佳答案

P1391r3提出了这个,尽管它在最终被 C++20 采用的版本中被删除了:P1391r4 .不幸的是,论文中完全没有掉落的原因(事实上,论文甚至没有提到它被掉落)。
然而,后续论文P1989R0将问题呈现为如果我们有这样的类型会发生什么(我稍微修改了示例):

struct buffer {
buffer() {};
char const* begin() const { return data; }
char const* end() const { return data + 42; }
operator string_view() const {
return string_view(data, data + 2);
}
private:
char data[42];
};
在这里, buffer可转换为 string_view .但是它可以转换为 string_view的方式不同之处在于 string_view的范围构造函数会这样做(前者为您提供两个字符,后者为您提供 42 个字符)。据我所知,实际上没有人指出此类类型的存在。
然而,方向是确保这些类型继续正常工作,因此新论文对特定构造函数有一组更复杂的约束。

一个更有趣的例子是:
using ci_string = std::basic_string<char, case_insensitive_traits>;

ci_string value = "Hello";
std::string_view sv = value;
任何类型的基于范围的简单推理都允许从 ci_string 进行转换。至 std::string .一个 ci_stringchar 的完美连续范围,没有任何奇怪的转换问题,如 buffer之前的类型。但同时 ci_string应该可以转换为 basic_string_view<char, case_insensitive_traits> ,我们可能不想避免它被转换为普通 string_view .这不太可能是故意的,所以这是我们需要努力防范的。
这个案例对我来说比 buffer 更有动力案件。

关于c++ - 从一系列字符构建 string_view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64228959/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com