is-integer-like , is-signed-integer-like
|
template
<
class
T
>
constexpr bool /*is-integer-like*/ = /* 説明を参照 */ ; |
(1) |
(C++20以降)
( 説明専用* ) |
|
template
<
class
T
>
constexpr bool /*is-signed-integer-like*/ = /* 説明を参照 */ ; |
(2) |
(C++20以降)
( 説明専用* ) |
T
が整数ライクな型である場合に限ります。
T
が符号付き整数様型である場合に限ります。
目次 |
整数クラス型
型
T
が
integer-class type
であるとは、以下で定義されるように
integer types
と同様の振る舞いをする実装定義の型の集合に属する場合を指します。
以下
で定義されます。integer-class typeは必ずしも
class type
であるとは限りません。
整数クラス型は
2
N
個の連続した整数を表現でき、ここで正の整数
N
は整数クラス型の
幅
と呼ばれます。
整数クラス型は、符号付きまたは符号なしのいずれかです:
-
符号付き整数クラス型
は
[-2 N-1
,2 N-1
-1]の範囲内のすべての整数を表現できます。ここで N はすべての符号付き整数型の幅よりも大きい値です。 -
符号なし整数クラス型
は
[0,2 N
-1]の範囲内のすべての整数を表現できます。ここで N はすべての符号なし整数型の幅よりも大きい値です。
すべての整数クラス型は
regular
および
three_way_comparable
<
std::
strong_ordering
>
をモデル化します。
整数クラス型の value-initialized オブジェクトは値 0 を持ちます。
整数クラス型
T
の式
E
は、
文脈的変換可能
であり、
bool
型へは
bool
(
E
!
=
T
(
0
)
)
によって変換されるかのように扱われます。
整数ライク型
(おそらくCV修飾された)
bool
以外の型は、
integral
コンセプトをモデル化するか、整数クラス型である場合、
整数様
である。
-
整数ライク型は、
signed_integralをモデル化する場合、または符号付き整数クラス型である場合、 符号付き整数ライク である。 -
整数ライク型は、
unsigned_integralをモデル化する場合、または符号なし整数クラス型である場合、 符号なし整数ライク である。
必須動作
整数クラス型の式は、任意の整数ライク型に明示的に変換可能であり、同じ符号性を持ち幅が等しいかより大きい任意の整数クラス型に暗黙的に変換可能です。整数型の式は、任意の整数クラス型に暗黙的および明示的に変換可能です。整数型と整数クラス型の間、および2つの整数クラス型の間の変換は、例外を送出しません。そのような変換の結果は、変換元の値を法
2
N
で合同な、変換先型の一意の値となります。ここで
N
は変換先型の幅です。
Int<T>
を以下の型として定義します:
-
Tが整数クラス型の場合、Int<T>はTと同じ符号性とビット幅を持つ唯一の仮想的な 拡張整数型 です。 -
Tが整数型の場合、Int<T>はTと同じ型とします。
以下の型、値、および演算子が与えられた場合:
| 型 | 定義 |
IC
|
整数クラス型 |
IL
|
整数ライク型 |
| 値 | 定義 |
| a |
IC
型のオブジェクト
|
| b |
IL
型のオブジェクト
|
| c | 整数型の左辺値 |
| x |
Int<IC>
型のオブジェクトで、
a
と同じ値を表す
|
| y |
Int<IL>
型のオブジェクトで、
b
と同じ値を表す
|
| 演算子 | 定義 |
| @ = | + = 、 - = 、 * = 、 / = 、 % = 、 & = 、 | = 、 ^ = 、 <<= 、 >>= のいずれか |
| @ | + 、 - 、 * 、 / 、 % 、 & 、 | 、 ^ 、 << 、 >> 、 && 、 || 、 == 、 ! = 、 < 、 > 、 <= 、 >= 、 <=> 、 , のいずれか |
以下の式は、指定された条件が満たされている場合、適切な形式であり、指定された結果と効果を持たなければなりません:
| 式 | 条件 | 結果 | 効果 |
|---|---|---|---|
| a ++ | 条件なし |
IC
型のprvalueで、評価前の
a
の値と等しい値を持つ
|
a の値に 1 を加えて変更する |
| a -- | aの値を a から 1 を減算することで変更する | ||
| ++ a | 式等価 である a + = 1 | ||
| -- a | 式は以下と等価 a - = 1 | ||
| & a | 式は以下と等価 std:: addressof ( a ) | ||
| ! a | ! x は整形式です | ! x と同じ | |
| + a | + x は well-formed |
same as
+
x
, but has type
IC
|
same as + 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 と同じ |
| b @ a | y @ x が適切に形成される |
y @ x
と同じだが、結果の型が異なる:
|
y @ x と同じ |
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 修正後の動作 |
|---|---|---|---|
|
LWG 3366
( P2393R1 ) |
C++20 |
integer-class型と対応する整数型間の変換で
表現可能な値が生成される保証がなかった |
保証される |
|
LWG 3376
( P2393R1 ) |
C++20 | integer-class型はクラス型のみに限定されていた |
非クラス型も
許可される |
| LWG 3467 | C++20 | bool がinteger-like型として扱われていた | 除外される |
|
LWG 3575
( P2393R1 ) |
C++20 | integer-class型が三方比較可能であることが保証されていなかった | 保証される |
関連項目
|
(C++20)
|
semiregular
型が前置および後置インクリメント演算子でインクリメント可能であることを指定する
(コンセプト) |