C++20中std::ranges::split_view状态及示例编译报错原因问询
问题解答
核心原因
std::ranges::split_view本身确实是C20就引入的标准组件,但你遇到的编译错误是因为**直接将split_view返回的子元素赋值给std::string_view的特性属于C23新增能力**,并不在C++20的标准规定范围内。
- C++20中,
split_view迭代器解引用得到的是普通的std::ranges::subrange类型,没有定义到std::string_view的隐式转换规则,所以直接赋值会触发类型不匹配的编译错误。 - C23专门为连续的字符类子范围新增了到
std::string_view、std::wstring_view等类型的隐式转换逻辑,这也是cppreference的示例标注C23的原因。
编译器表现差异说明
- 你看到MSVC在C20模式下提示
<ranges>内容仅在clatest模式可用,是因为旧版本MSVC对C20 ranges的实现尚未成熟,仅在实验性的clatest模式下提供支持,新版本MSVC已经可以在/std:c++20参数下使用ranges相关组件了。 - GCC的C++23特性实现进度较快,已经覆盖了上述子范围转字符串视图的规则,所以使用
-std=c++2b参数即可正常编译示例代码。 - MSVC目前还未实现该C++23转换特性,因此即使用
/std:c++latest参数启用最新实验特性,仍然会报类型转换失败的错误。
C++20兼容写法
如果需要在C++20环境下实现相同逻辑,只需要显式从子范围构造std::string_view即可:
#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 auto sub_range : std::ranges::split_view(words, delim)) { const std::string_view word(sub_range.begin(), sub_range.end()); std::cout << std::quoted(word) << ' '; } }
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

