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

为何std::ranges::min/max/minmax要求迭代器满足indirectly_copyable_storable?

关于std::ranges::max系列函数约束的疑问

以下代码无法正常编译运行:

#include <ranges>
#include <algorithm>
#include <memory>
#include <iostream>

int main() {
  std::cout << *std::ranges::max(
    std::views::iota(0, 5) |
    std::views::transform([](int i) { return std::make_unique<int>(i); }),
    {},
    std::ranges::iter_move // 等价于 '[](auto&& p) { return *p; }'
  );
}

问题出在std::ranges::max(包括std::ranges::min/minmax)的签名要求满足indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*>约束,其签名定义如下:

template<input_range R, class Proj = identity,
         indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
  requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*>
  constexpr range_value_t<R>
    ranges::max(R&& r, Comp comp = {}, Proj proj = {});

indirectly_copyable_storable用于检查迭代器的value_type是否可临时存储并重新赋值,它的定义包含多个indirectly_writable相关要求,而代码中的unique_ptr<int>因不可拷贝,无法满足这一约束。

但从实际编译器实现(比如MSVC-STL)来看,std::ranges::max仅需要构造值并在条件满足时重新赋值,似乎并不需要这么严格的约束。由此引出以下疑问:

  • indirectly_copyable_storable中的四个indirectly_writable要求源自何处?
  • 为什么std::ranges::min/max/minmax需要indirectly_copyable_storable约束?背后有哪些设计考量?
  • <algorithm>中仅有std::ranges::max系列和std::ranges::unique_copy使用该约束,且后者的实现也存在过约束的情况,因此需要探究indirectly_copyable_storable的设计由来。

内容的提问来源于stack exchange,提问作者康桓瑋

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:45:08