如何将 int 转换为 string 然后与 std::ranges::views 连接?

lun*_*nuy 0 c++ c++20 std-ranges

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

如果我使用std::stringlambda 的返回类型进行转换,它会在编译时引发许多错误。我想我应该把它改成std::string_view. 我这样改了,编译没有编译错误。但是,如果我std::string_view在那里使用,lambda 函数仅返回字符串的引用,并且当 lambda 结束时,堆栈内存上的翻译字符串将被从内存中删除。因此,该程序不会打印任何内容。

我该如何修复它?

康桓瑋*_*康桓瑋 5

如果我使用std::stringlambda 的返回类型进行转换,它会在编译时引发许多错误。

您观察到的是 C++20 缺陷,已由P2328解决。如果您使用已经实现 P2328 的较新编译器版本(例如 gcc-11.2),您的代码将是格式良好的

在P2328之前,我认为标准中没有简单的解决方案。