如何连接range构成的range?std::views::join使用报!=运算符不匹配错误
问题解决方案
这个!=运算符不匹配的报错,通常是C++20 range特性的实现兼容问题或者range类型不符合范围for要求导致的,可按以下步骤排查解决:
- 先确认编译选项开启了完整C++20支持
GCC/Clang编译参数需要加上-std=c++20,MSVC需要加上/std:c++20。旧版本编译器对迭代器和异类型哨兵的比较运算支持不完善,范围for场景下会找不到对应的!=运算符重载。 - 将返回的join视图转为common range
如果child->points()返回的子range本身不是common range(即begin()和end()返回值类型不同),那么std::views::join生成的视图也会是迭代器和哨兵类型不同的非common range,部分编译器的范围for实现不支持这种情况。你可以用std::views::common将视图转为common range,修改代码如下:auto points() const { auto ranges = children() | std::views::transform([](auto child) { return child->points(); }); return std::views::join(ranges) | std::views::common; } - 修复临时range的生命周期问题
如果你用的标准库版本对prvalue类型的子range支持有缺陷,可以在transform的lambda里用std::views::all包裹child->points()的返回值,确保视图的生命周期合法:
另外如果[](auto child) { return std::views::all(child->points()); }children()返回的是临时容器,你需要将它存储到生命周期足够的成员变量中,避免join视图引用悬空。 - 升级编译器和标准库版本
低于GCC10、MSVC 19.29的版本对std::views::join的实现存在多个已知bug,升级到支持C++20 range完整特性的版本即可解决大部分兼容问题。
内容的提问来源于stack exchange,提问作者Jevs
相关产品推荐
相关产品推荐

