为何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,提问作者康桓瑋
相关产品推荐
相关产品推荐

