std::clamp自C++17起可用,用于将值安全约束在闭区间[low, high]内,要求三参数同类型或可隐式转换,且low≤high,否则行为未定义。
直接说结论:std::clamp 在 C++17 起可用,能安全、简洁地把一个值约束在给定上下界之间,但必须注意类型匹配和迭代器/指针等非常规类型的误用。
std::clamp 的基本用法和参数顺序
std::clamp 接收三个同类型(或可隐式转换)的参数:待约束值、下界、上界,返回值是落在 [low, high] 内的值(闭区间)。它不修改原变量,需显式赋值。
常见错误是把上下界顺序搞反——std::clamp(x, a, b) 要求 a ,否则行为未定义(不是自动交换)。
- 正确写法:
int x = 15; int y = std::clamp(x, 0, 10); // y == 10 - 危险写法:
std::clamp(x, 10, 0)—— 触发未定义行为,编译器通常不报错 - 支持自定义比较器,比如按绝对值:
std::clamp(x, -5, 5, [](int a, int b) { return std::abs(a) (但此时语义已非“数值边界”,慎用)
类型不一致时的编译失败与隐式转换陷阱
std::clamp 模板参数要求三个实参能统一为同一类型。混用 int 和 double 会编译失败,除非有明确的隐式转换路径,但可能丢失精度。