字符串向量和具有C ++ 20范围的变换

问题描述 投票:0回答:2

以下C ++ 20范围基本语法有什么问题(Ubuntu 20.04,gcc g ++(Ubuntu 10-20200411-0ubuntu1)10.0.1 20200411(实验性)[主修订版bb87d5cc77d:75961caccb7:f883c46b4877f637e0fa5025b4d6b5c9040ec566]]

#include <iostream>
#include <vector>
#include <ranges>

[[nodiscard]]
auto f(const std::vector<std::string>& vec) {
   return vec | std::views::transform([] (const std::string &f){ 
      return f.size(); });
}

int main() {
    const auto v = f({"c", "dddddddd", "aaaa", "bb"});
    for(auto i : v)
        std::cout << i << ' ';
    std::cout << '\n';
    return 0;
}

我想获取一个字符串向量,并将其转换为每个字符串的大小。

尝试使用C ++ 11 range for-loop进行迭代只是崩溃。在gdb中,我可以看到std :: range视图指向无效的内存。

使用与上述相同的结构处理非字符串可以正常工作。

[以下C ++ 20范围基本语法有什么问题(Ubuntu 20.04,gcc g ++(Ubuntu 10-20200411-0ubuntu1)10.0.1 20200411(实验性)[主修订版bb87d5cc77d:75961caccb7:...

c++ c++20
2个回答
1
投票

您的编译器没有错。您的代码具有未定义的行为。视图是惰性计算的,访问时要求基础容器仍处于活动状态。您所拥有的类似于悬挂的参考。


-1
投票

似乎是一个10.0.1错误。以Pete的示例为例,并在10.0.1上进行尝试,可以重现该问题。 (无限循环) 。https://godbolt.org/z/PqdceV10.1上完全相同的代码产生了所需的行为。我想我现在需要坚持使用编译器浏览器来学习范围。

© www.soinside.com 2019 - 2024. All rights reserved.