You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:54:09