You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCC 14报错‘no match for operator *’,为何无法使用operator *?

解决GCC 14中ranges::min_element返回值无法解引用的问题

问题场景

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:52:11