使用 std::ranges::views 替换

Using replace with std::ranges::views

我正在尝试使用 Microsoft Visual Studio 2019 学习 C++20 中的范围。

我创建了一个函数来将字符串中的字母变成小写并将所有空格替换为“_”。

template <typename R>
auto cpp20_string_to_lowercase_without_spaces( R&& rng )
{
    auto view = rng
        | std::ranges::views::transform( ::tolower )
        | std::ranges::views::common;

    std::ranges::replace( view, ' ', '_' );
    return view;
}

我收到以下错误:

Error   C2672   'operator __surrogate_func': no matching overloaded function found  
Error   C7602   'std::ranges::_Replace_fn::operator ()': the associated constraints are not satisfied

我尝试使用 view.begin(), view.end() 我尝试在调用 std::ranges::replace 之前使用 std::ranges::copy

是我做错了什么吗?

PS:在项目设置中,我不得不select Preview - Features from the Latest C++ Working Draft (/std:c++latest)因为有了ISO C++20 Standard (/std:c++20)和最新版本的Visual Studio 2019预览我可以' 使用没有编译错误的视图。

transform 创建一个不可修改的视图。具体来说,它会创建一个范围,其中包含根据需要制造的对象。它们没有永久、固定的存储空间,因此无法用其他东西“替换”它们。

您可以将范围复制到容器中,然后在容器上执行替换操作。