is-integer-like , is-signed-integer-like
From cppreference.com
template< class T > constexpr bool /*is-integer-like*/ = /* see description */; |
(1) | (C++20以降) (説明用*) |
template< class T > constexpr bool /*is-signed-integer-like*/ = /* see description */; |
(2) | (C++20以降) (説明用*) |
1) /*is-integer-like*/<T> は、
T が整数型のような型である場合にのみ true です。2) /*is-signed-integer-like*/<T> は、
T が符号付き整数型のような型である場合にのみ true です。目次 |
[編集] 整数クラス型
型 T は、整数型のように振る舞う、実装定義の型の集合に含まれる場合、下記で定義されるとおり、「整数クラス型」です。整数クラス型は必ずしもクラス型であるとは限りません。
整数クラス型は、2N
個の連続する整数を表すことができ、ここで N は正の整数であり、整数クラス型の「幅」と呼ばれます。
整数クラス型は、符号付きまたは符号なしのいずれかです。
- 「符号付き整数クラス型」は、
[-2N-1,2N-1
-1]のすべての整数を表すことができ、ここで N はすべての符号付き整数型の幅よりも大きいです。 - 「符号なし整数クラス型」は、
[0,2N
-1]のすべての整数を表すことができ、ここで N はすべての符号なし整数型の幅よりも大きいです。
すべての整数クラス型は、regular および three_way_comparable<std::strong_ordering> をモデル化します。
整数クラス型の 値初期化されたオブジェクトは値 0 を持ちます。
整数クラス型 T の式 E は、bool(E != T(0)) のように、文脈変換により bool に変換可能(コンテキスト変換)です。
[編集] 整数型のような型
(cv修飾された) bool 以外の型は、integral をモデル化するか、または整数クラス型である場合に、「整数型のような型」です。
- 整数型のような型は、
signed_integralをモデル化するか、または符号付き整数クラス型である場合に、「符号付き整数型のような型」です。 - 整数型のような型は、
unsigned_integralをモデル化するか、または符号なし整数クラス型である場合に、「符号なし整数型のような型」です。
[編集] 必須の振る舞い
整数クラス型の式は、任意の整数型のような型に明示的に変換可能であり、同じ幅で同じ符号を持つ任意の整数クラス型には暗黙的に変換可能です。整数型の式は、任意の整数クラス型に暗黙的にも明示的にも変換可能です。整数型と整数クラス型の間の変換、および2つの整数クラス型間の変換は、例外を発生させません。そのような変換の結果は、宛先型の幅 N を法とする合同な一意の値です。
以下の型を Int<T> と表記します。
Tが整数クラス型の場合、Int<T>は、Tと同じ符号を持ち同じ幅を持つ、一意の仮想的な拡張整数型です。Tが整数型の場合、Int<T>はTと同じ型です。
以下の型、値、および演算子を考慮します。
| 型 | 定義 |
IC
|
整数クラス型 |
IL
|
整数型のような型 |
| 値 | 定義 |
| a | IC 型のオブジェクト |
| b | IL 型のオブジェクト |
| c | 整数型の左辺値 |
| x | a と同じ値を表す Int<IC> 型のオブジェクト |
| y | b と同じ値を表す Int<IL> 型のオブジェクト |
| Operator | 定義 |
| @= | +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= のいずれか |
| @ | +, -, *, /, %, &, |, ^, <<, >>, &&, ||, ==, !=, <, >, <=, >=, <=>, , のいずれか |
以下の式は、指定された条件が満たされる場合、適切に形成され、指定された結果と効果を持ちます。
| 式 | 条件 | 結果 | 効果 |
|---|---|---|---|
| a++ | 条件なし | a の評価前の値と同じ値を持つ IC 型の右辺値 |
a の値を 1 加算して変更します。 |
| a-- | a の値を 1 減算して変更します。 | ||
| ++a | a += 1 に式等価 | ||
| --a | a -= 1 に式等価 | ||
| &a | std::addressof(a) に式等価 | ||
| !a | !x は適切に形成されます。 | !x と同じ | |
| +a | +x は適切に形成されます。 | +x と同じですが、型は IC です。 |
+x と同じ |
| -a | -x は適切に形成されます。 | -x と同じですが、型は IC です。 |
-x と同じ |
| ~a | ~x は適切に形成されます。 | ~x と同じですが、型は IC です。 |
~x と同じ |
| c @= a | c @= x は適切に形成されます。 | c を参照する左辺値 |
c @= x と同じ |
| a @= b | x @= y は適切に形成されます。 | a を参照する左辺値 |
x @= y と同じですが、x に格納される値は a に格納されます。 |
| a @ b | x @ y は適切に形成されます。 | x @ y と同じですが、結果の型は異なります。
|
x @ y と同じ |
| b @ a | y @ x は適切に形成されます。 | y @ x と同じですが、結果の型は異なります。
|
y @ x と同じ |
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3366 (P2393R1) |
C++20 | 整数クラス型とその対応する 整数型との間の変換は、表現可能な値を生成することが保証されていませんでした。 |
保証された |
| LWG 3376 (P2393R1) |
C++20 | 整数クラス型はクラス型のみである可能性がありました。 | も許可 非クラス型 |
| LWG 3467 | C++20 | bool が整数型のような型として考慮されていました。 |
除外された |
| LWG 3575 (P2393R1) |
C++20 | 整数クラス型は三方向比較可能であることが保証されていませんでした。 | 保証された |
[編集] 関連項目
| (C++20) |
semiregular 型が前置および後置インクリメント演算子でインクリメントできることを規定する(コンセプト) |