如何将 int 转换为字符串然后加入 std::ranges::views?

How can I transform int to string then join with std::ranges::views?

#include <iostream>
#include <numeric>
#include <ranges>
#include <vector>
#include <string>
#include <string_view>

int main() {
    auto str = (
        std::views::iota(1)
        | std::ranges::views::take(5)
        | std::ranges::views::transform([](int x) -> std::string_view {
            return std::to_string(x) + "|";
        })
        | std::ranges::views::join
    );

    for (const char ch : str) {
        std::cout << ch;
    }

    return 0;
}

我是 cpp 函数式编程的新手。我想生成前五个自然数并将它们转换为字符串,然后加入它们并打印出来。

如果我使用 std::string 作为 return 类型的 lambda 进行转换,它会在编译时抛出很多错误。我想我应该把它改成std::string_view。我是这样改的,它编译没有编译错误。但是,如果我在那里使用 std::string_view,lambda 函数 returns 仅引用字符串,并且当 lambda 结束时,堆栈内存中的翻译字符串将在内存中删除。所以,程序不打印任何东西。

我该如何解决?

If I use std::string for return type of lambda for transform, it throws many error on compile time.

您观察到的 C++20 缺陷已被 P2328. If you use a newer compiler version that has already implemented P2328 (such as gcc-11.2), your code will be well-formed 解决。

在P2328之前,我觉得标准里有no simple solution