以下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:...
您的编译器没有错。您的代码具有未定义的行为。视图是惰性计算的,访问时要求基础容器仍处于活动状态。您所拥有的类似于悬挂的参考。
似乎是一个10.0.1错误。以Pete的示例为例,并在10.0.1上进行尝试,可以重现该问题。 (无限循环) 。https://godbolt.org/z/PqdceV10.1上完全相同的代码产生了所需的行为。我想我现在需要坚持使用编译器浏览器来学习范围。