std::unreachable_sentinel_t, std::unreachable_sentinel
来自cppreference.com
在标头 <iterator> 定义
|
||
struct unreachable_sentinel_t; |
(1) | (C++20 起) |
inline constexpr unreachable_sentinel_t unreachable_sentinel{}; |
(2) | (C++20 起) |
1)
unreachable_sentinel_t
是能用于表示无界区间“上界”的空类类型。2)
unreachable_sentinel
是 unreachable_sentinel_t
类型的常量。目录 |
[编辑] 非成员函数
operator== (C++20) |
比较一个 unreachable_sentinel_t 与任何 weakly_incrementable 类型的值 (函数模板) |
operator==(std::unreachable_sentinel_t)
template< std::weakly_incrementable I > friend constexpr bool operator==( unreachable_sentinel_t, const I& ) noexcept |
(C++20 起) | |
unreachable_sentinel_t
能与任何 weakly_incrementable
类型比较,而结果始终为 false。
此函数模板对常规的无限定或有限定查找不可见,而只能在 std::unreachable_sentinel_t
为实参的关联类时由实参依赖查找找到。
[编辑] 示例
运行此代码
#include <concepts> #include <cstddef> #include <iterator> #include <ranges> #include <utility> namespace ranges = std::ranges; // 永不检查 iter != r.end() template<ranges::random_access_range R> constexpr std::size_t trivial_strlen(R&& r) { auto iter = r.begin(); while (*iter != ranges::range_value_t<R>{}) ++iter; return iter - r.begin(); } template<ranges::random_access_range R> constexpr std::size_t my_strlen(R&& r) { if constexpr (std::same_as<ranges::sentinel_t<R>, std::unreachable_sentinel_t>) return trivial_strlen(std::forward<R>(r)); else return ranges::find(std::forward<R>(r), ranges::range_value_t<R>{}) - ranges::begin(r); } int main() { constexpr static char str[] = "The quick brown fox jumps over a lazy dog."; static_assert(my_strlen(str) == 42); // 能更快地确定字符串长度,但是在 str 不是空终止字符串时行为未定义 constexpr auto unsafe_str = ranges::subrange{str, std::unreachable_sentinel}; static_assert(my_strlen(unsafe_str) == 42); }
[编辑] 参阅
(C++20) |
由通过重复对某个初值自增所生成的序列组成的 view (类模板) (定制点对象) |