GCC 14报错‘no match for operator *’,为何无法使用operator *?
问题场景
使用GCC 14编译C++代码时,出现no match for 'operator*'错误,无法对ranges::min_element的返回值使用operator*解引用。
代码示例
#include <algorithm> #include <ranges> using namespace std; int main() { auto rng = views::iota(0, 3); const auto [a, b] = * ranges::min_element(views::cartesian_product(rng, rng)); return 0; }
错误信息
prog.cc: In function 'int main()':
prog.cc:7:29: error: no match for 'operator*' (operand type is 'std::ranges::borrowed_iterator_t<std::ranges::cartesian_product_view<std::ranges::iota_view<int, int>, std::ranges::iota_view<int, int> > >')
7 | const auto [a, b] = * ranges::min_element(views::cartesian_product(rng, rng));
|
解决方案
问题根源在于views::cartesian_product返回临时视图对象,ranges::min_element针对这种场景返回的borrowed_iterator_t类型迭代器被标准库禁用了解引用——临时视图销毁后迭代器会悬空,禁用解引用是为了避免未定义行为。
提供两种可行解决方法:
方法一:存储笛卡尔积视图到变量
将cartesian_product的结果保存到变量,让视图生命周期覆盖迭代器的使用周期:
#include <algorithm> #include <ranges> using namespace std; int main() { auto rng = views::iota(0, 3); auto cartesian_rng = views::cartesian_product(rng, rng); const auto [a, b] = *ranges::min_element(cartesian_rng); return 0; }
方法二:使用ranges::min替代ranges::min_element
若仅需获取最小值元素而非迭代器,直接用ranges::min更简洁,它会直接返回元素值,无需手动解引用:
#include <algorithm> #include <ranges> using namespace std; int main() { auto rng = views::iota(0, 3); const auto [a, b] = ranges::min(views::cartesian_product(rng, rng)); return 0; }
内容的提问来源于stack exchange,提问作者Ludovic Aubert

