Fed*_*dor 2 c++ c++20 std-ranges c++23
根据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) << ' ';
}
}
Run Code Online (Sandbox Code Playgroud)
GCC 和 MSVC 都拒绝接受 C++20 模式下的这个示例。MSVC 特别打印:
The contents of <ranges> are available only in c++latest mode with concepts support;
Run Code Online (Sandbox Code Playgroud)
https://gcc.godbolt.org/z/4fGGb3aqY
-std=c++2bGCC 开始使用命令行开关接受代码(意味着即将推出的 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
Run Code Online (Sandbox Code Playgroud)
演示: https: //gcc.godbolt.org/z/6z48Mz45j
C++20 模式下的示例是否有问题,或者它确实需要编译器提供一些 C++23 功能?
正如评论中提到的,P2499在 C++23 中创建了string_view范围构造函数,因此不再隐式转换为原始示例。explicitsubrangestring_view
您需要显式构造string_view为cppreference Updated:
for (const auto word : std::views::split(words, delim))
// with string_view's C++23 range constructor:
std::cout << std::quoted(std::string_view(word)) << ' ';
Run Code Online (Sandbox Code Playgroud)
这
for (const std::string_view word : std::ranges::split_view(words, delim)) {
std::cout << std::quoted(word) << ' ';
}
Run Code Online (Sandbox Code Playgroud)
需要解决一项 C++20 缺陷并实现一项 C++23 功能才能构成良好。
第一个是P2210,它将原来的更名split_view为lazy_split_view并重新设计了新的split_view。其中一项改进是它value_type被定义为subrange,这意味着当新的split_view应用于 a时contiguous_range,分割子范围也将是contiguous_ranges 。
所以split_view(words, delim)在你的例子中将返回一系列的subrange模型contiguous_range。
第二个是P1989,它添加了一个范围构造函数,string_view以便它可以接受 acontiguous_range并初始化其成员。
由于它是 C++23 功能,因此该示例的文本中包含“C++23”。
| 归档时间: |
|
| 查看次数: |
2181 次 |
| 最近记录: |