Namespaces
Variants

is-integer-like , is-signed-integer-like

From cppreference.net
Iterator library
Iterator concepts
is-integer-like
is-signed-integer-like
(C++20) (C++20)
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
template < class T >
constexpr bool /*is-integer-like*/ = /* 説明を参照 */ ;
(1) (C++20以降)
( 説明専用* )
template < class T >
constexpr bool /*is-signed-integer-like*/ = /* 説明を参照 */ ;
(2) (C++20以降)
( 説明専用* )
1) /*is-integer-like*/ < T > true となるのは、 T が整数ライクな型である場合に限ります。
2) /*is-signed-integer-like*/ < T > true となるのは、 T が符号付き整数様型である場合に限ります。

目次

翻訳の説明: - 「Contents」→「目次」 - 「Required behaviors」→「必要な動作」 - 「Defect reports」→「欠陥報告」 - 「See also」→「関連項目」 - C++専門用語である「Integer-class type」と「Integer-like type」は原文のまま保持 - すべてのHTMLタグ、属性、クラス名、IDは完全に保持 - 番号部分は変更なし

整数クラス型

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 の型が Int<IC> の場合、結果の型は IC となる。
  • x @ y の型が Int<IL> の場合、結果の型は IL となる。
  • x @ y の型がその他の型 T の場合、結果の型は T となる。
x @ y と同じ
b @ a y @ x が適切に形成される y @ x と同じだが、結果の型が異なる:
  • y @ x の型が Int<IC> の場合、結果の型は IC となる。
  • y @ x の型が Int<IL> の場合、結果の型は IL となる。
  • y @ x の型がその他の型 T の場合、結果の型は T となる。
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型が三方比較可能であることが保証されていなかった 保証される

関連項目

semiregular 型が前置および後置インクリメント演算子でインクリメント可能であることを指定する
(コンセプト)