namespace std {
template<class T>
inline constexpr bool is-integer-like = /*see below*/;
template<class T>
inline constexpr bool is-signed-integer-like = /*see below*/;
}
概要
これらの説明専用の変数テンプレートは、任意の型T
が符号付/なし整数型そのものあるいはそれと同様に扱える型である場合にtrue
を示すものである。
これは標準ライブラリ内において、イテレータの差分型(difference_type
)として実装定義の整数型の使用を許可するためにコンセプトの文脈で使用される。
効果
is-integer-like<T>
はT
がintegral
のモデルとなるかinteger-classである時にtrue
を示す。ただし、T
がbool
かそのCV修飾された型である場合は常にfalse
となる。
is-signed-integer-like<T>
はT
がinteger-like
(is-integer-like<T> == true
)であり、signed_integral
のモデルとなるかsigned-integer-classである時にtrue
を示す。
(signed-)integer-class型
integer-class型は組み込みの整数型と同じように動作する実装定義のクラス型である。
integer-class型の表現可能な範囲はそれが定義する値の連続集合であり、0
と1
を必ず含んでいなければならない。この時、その範囲に負の数が含まれていればその型はsigned-integer-class型であり、それ以外のものはunsigned-integer-class型である。
要件
I
をあるinteger-class型、B
を少なくともI
と同じ範囲の値を表現可能で同じ幅を持つ別のinteger-class型とする。
I
の値a, b
、a, b
それぞれと同じ値を表現するB
の値x, y
と任意の整数型の値c
について次のことが成り立つ。
- 式
@x
が適格である全ての単項演算子@
について@a
もまた適格であり、共に同じ値、効果、値カテゴリを持つ。@x
がbool
型を示す場合@a
もまたbool
型を示すが。@x
がB
を示す場合は@a
はI
を示す。 - 式
c @= x
が適格である全ての(複合)代入演算子@=
についてc @= a
もまた適格であり、共に同じ値、効果を持つ。式c @= a
の結果はc
を参照するlvalueとなる。 - 式
x @ y
が適格である全ての二項演算子@
についてa @ b
もまた適格であり、結果の値をI
が表現できる場合は共に同じ値、効果、値カテゴリを持つ。x @ y
がbool
型を示す場合a @ b
もまたbool
型を示すが。x @ y
がB
を示す場合はa @ b
はI
を示す。 - integer-class型の値は任意の整数型に明示的に変換でき、任意の整数型の値はinteger-class型に暗黙的にも明示的にも変換できる。それらの変換は例外を送出しない。
- integer-class型の式
E
はbool(E != I(0))
のように文脈的にbool
に変換できる。 - integer-class型は
regular
及びtotally_ordered
のモデルとなる。 - 値初期化されたinteger-class型の値は
0
になる。
integer-class型I
についてnumeric_limits<I>
の特殊化は次のような値を示す。
numeric_limits<I>::is_specialized == true
numeric_limits<I>::is_signed== true
I
がsigned-integer-class型の場合のみ
numeric_limits<I>::digits
はI
の幅と等しいnumeric_limits<I>::digits10
はstatic_cast<int>(digits * log10(2))
と等しいnumeric_limits<I>::min()
とnumeric_limits<I>::max()
はそれぞれ、I
の表現可能な値の最小値と最大値を返す。numeric_limits<I>::lowest()
はnumeric_limits<I>::max()
を返す。
実装例 (MSVC)
inline constexpr bool _Is_nonbool_integral = is_integral_v<_Ty> && !is_same_v<remove_cv_t<_Ty>, bool>;
template <class _Ty>
inline constexpr bool _Integer_class = requires {
typename _Ty::_Signed_type;
typename _Ty::_Unsigned_type;
};
template <class _Ty>
concept _Integer_like = _Is_nonbool_integral<remove_cv_t<_Ty>> || _Integer_class<_Ty>;
template <class _Ty>
concept _Signed_integer_like = _Integer_like<_Ty> && static_cast<_Ty>(-1) < static_cast<_Ty>(0);
上記の説明のうち構文的な要件を素直に実装している。MSVCでは、128ビット整数がinteger-class型である。
バージョン
言語
- C++20