【问题标题】:Using replace with std::ranges::views使用替换为 std::ranges::views
【发布时间】:2021-09-21 21:44:00
【问题描述】:

我正在尝试使用 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:在项目设置中,我必须选择 Preview - Features from the Latest C++ Working Draft (/std:c++latest),因为在最新版本的 Visual Studio 2019 预览版中使用 ISO C++20 Standard (/std:c++20),我无法在没有编译错误的情况下使用视图。

【问题讨论】:

    标签: c++ c++20 msvc12


    【解决方案1】:

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

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

    【讨论】:

    • 我尝试使用自动范围 = std::ranges::copy(view);但是那行给了我一些错误,说我不能在没有初始化的情况下使用范围。当然,在这种情况下,在替换中我使用范围而不是视图。
    • @Check: ranges::copy 从一个范围复制到另一个范围。它不创建容器;你必须这样做。请查看您正在使用的函数的文档在使用它们之前
    猜你喜欢
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2021-05-11
    • 2020-01-11
    • 2022-11-24
    • 2020-11-15
    相关资源
    最近更新 更多