c++ - C++20 中 std::ranges::split_view 的状态是什么?
问题描述
根据https://en.cppreference.com/w/cpp/ranges/split_view,std::ranges::split_view
必须从 C++20 开始可用。但是,同一页面上的示例在其文本中包含“C++23”:
#include <iostream>
#include <iomanip>
#include <ranges>
#include <string_view>
int main() {
constexpr std::string_view words{"Hello-_-C++-_-23-_-!"};
constexpr std::string_view delim{"-_-"};
for (const std::string_view word : std::ranges::split_view(words, delim)) {
std::cout << std::quoted(word) << ' ';
}
}
GCC 和 MSVC 都拒绝接受 C++20 模式下的这个例子。MSVC 特别打印:
The contents of <ranges> are available only in c++latest mode with concepts support;
https://gcc.godbolt.org/z/4fGGb3aqY
GCC 开始接受带有-std=c++2b
命令行开关的代码(意味着即将推出的 C++23),而 MSVC 即使带有/std:c++latest
选项也会报告错误
error C2440: 'initializing': cannot convert from 'std::ranges::split_view<std::basic_string_view<char,std::char_traits<char>>,std::basic_string_view<char,std::char_traits<char>>>::_Outer_iter<true>::value_type' to 'std::basic_string_view<char,std::char_traits<char>>'
note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
演示:https ://gcc.godbolt.org/z/6z48Mz45j
C++20 模式下的示例是否有问题,或者它确实需要编译器提供一些 C++23 功能?
解决方案
这个
for (const std::string_view word : std::ranges::split_view(words, delim)) {
std::cout << std::quoted(word) << ' ';
}
需要解决一个 C++20 缺陷并实现一个 C++23 功能以形成良好的格式。
第一个是P2210,它把原来的改名split_view
为lazy_split_view
并重新设计了新的split_view
。改进之一是它value_type
被定义为subrange
,这意味着当将 newsplit_view
应用于 acontiguous_range
时,拆分子范围也将是contiguous_range
s。
因此split_view(words, delim)
,在您的示例中将返回一系列subrange
which models contiguous_range
。
第二个是P1989,它添加了一个范围构造函数,string_view
以便它可以接受 acontiguous_range
并初始化其成员。
由于它是 C++23 功能,这就是示例在其文本中包含“C++23”的原因。
推荐阅读
- java - Java并发:可重置启用/禁用等待条件
- javascript - 我收到 SyntaxError:WordPress 主题中的解析器错误
- r - spatstat 不均匀 K-、F- 和 G- 函数中的意外行为
- python - 如何用特定键而不是键盘中断异常停止无限循环?
- javascript - 使用本地存储查找返回用户的特定用户名
- javascript - 在 datepicker 中选择日期后,在我的年龄字段中获取 NaN
- angular - 模板解析错误:意外字符“EOF”
- python - Cesium - ImportError:无法导入名称重新提升
- php - 在命令窗口中为 Aria 项目使用 curl 我得到了我想要的但在 PHP 文件中它返回空字符串
- amazon-web-services - 如果我将弹性 IP 关联到我正在运行的 EC2 实例,它是否会丢弃其当前的公共 IP?