std:: unreachable_sentinel_t, std:: unreachable_sentinel
| Iterator concepts | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Iterator primitives | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Algorithm concepts and utilities | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Indirect callable concepts | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Common algorithm requirements | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Utilities | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Iterator adaptors | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
定義済みヘッダー
<iterator>
|
||
|
struct
unreachable_sentinel_t
;
|
(1) | (C++20以降) |
|
inline
constexpr
unreachable_sentinel_t unreachable_sentinel
{
}
;
|
(2) | (C++20以降) |
unreachable_sentinel_t
は、非有界区間の「上限」を示すために使用できる空のクラス型です。
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」がnull終端されていない場合は未定義動作 constexpr auto unsafe_str = ranges::subrange{str, std::unreachable_sentinel}; static_assert(my_strlen(unsafe_str) == 42); }
関連項目
|
(C++20)
|
初期値を繰り返しインクリメントして生成されるシーケンスからなる
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |