如何在不调用std::ranges::subrange的前提下声明可后续赋值的range对象?
解决方案
要在循环外声明可存储std::ranges::equal_range结果的range对象,且不提前调用std::ranges::subrange初始化,最直接的方式是用decltype推导equal_range的返回类型,再默认初始化对象。
方法1:基于已有容器推导类型
利用已声明的容器实例,直接推导equal_range的返回类型:
#include <ranges> #include <vector> #include <algorithm> // std::ranges::equal_range需包含此头 int main() { std::vector<int> values(10); // 推导equal_range的返回类型并默认初始化range decltype(std::ranges::equal_range(values, 0)) range; while (/* 你的循环条件 */) { range = std::ranges::equal_range(values, /* 目标查找值 */); } size_t last_range_size = range.size(); }
方法2:用std::declval通用推导
如果容器还未初始化,或需要更通用的写法,可结合std::declval推导类型:
#include <ranges> #include <vector> #include <algorithm> #include <utility> // std::declval需包含此头 int main() { std::vector<int> values(10); // 无需实际传入容器实例,直接推导类型 decltype(std::ranges::equal_range(std::declval<std::vector<int>&>(), std::declval<int>())) range; while (/* 你的循环条件 */) { range = std::ranges::equal_range(values, /* 目标查找值 */); } size_t last_range_size = range.size(); }
关键说明
std::ranges::equal_range的返回类型本质是std::ranges::subrange的特化(针对容器的迭代器类型),用decltype能自动推导这个复杂的特化类型,避免手动书写出错。- 默认初始化的
subrange内部迭代器处于未指定状态,但只要在赋值前不调用其成员函数(比如size()、begin()),就不会触发未定义行为,完全符合你的使用场景。
内容的提问来源于stack exchange,提问作者Damir Tenishev
相关产品推荐
相关产品推荐

