is-integer-like, is-signed-integer-like
來自 cppreference.com
< cpp | 迭代器 (iterator)
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> 為 true 當且僅當
T
是整數類型別。2) /*is-signed-integer-like*/<T> 為 true 當且僅當
T
是有符號整數類型別。目錄 |
[編輯] 整數類型別
型別 T
是整數類型別,如果它屬於一組實現定義的型別,其行為與整數型別相同,定義如下。整數類型別不一定是類型別。
整數類型別可以表示 2N
個連續整數,其中 N 是一個正整數,被稱為整數類型別的寬度。
整數類型別要麼是有符號的,要麼是無符號的
- 有符號整數類型別可以表示
[
-2N-1,
2N-1
-1]
中的所有整數,其中 N 大於所有有符號整數型別的寬度。 - 無符號整數類型別可以表示
[
0,
2N
-1]
中的所有整數,其中 N 大於所有無符號整數型別的寬度。
所有整數類型別都模型 regular
和 three_way_comparable
<std::strong_ordering>。
一個值初始化的整數類型別物件的值為 0。
整數類型別 T
的表示式 E 可以上下文轉換為 bool,如同透過 bool(E != T(0))。
[編輯] 整數類型別
除 (可能帶有 cv 限定的) bool 之外的型別是整數類型別,如果它模型 integral
或如果它是一個整數類型別。
- 整數類型別是有符號整數類型別,如果它模型
signed_integral
或如果它是有符號整數類型別。 - 整數類型別是無符號整數類型別,如果它模型
unsigned_integral
或如果它是一個無符號整數類型別。
[編輯] 所需行為
整數類型別的表示式可以顯式轉換為任何整數類型別,並隱式轉換為寬度相同或更大且符號相同的任何整數類型別。整數型別的表示式可以隱式和顯式轉換為任何整數類型別。整數和整數類型別之間以及兩個整數類型別之間的轉換不會透過異常退出。這種轉換的結果是目標型別中唯一與源模 2N
同餘的值,其中 N 是目標型別的寬度。
設 Int<T>
表示以下型別
- 如果
T
是整數類型別,則Int<T>
是一個唯一的假設的擴充套件整數型別,其符號與T
相同,寬度也與T
相同。 - 如果
T
是整數型別,則Int<T>
與T
是同一型別。
給定以下型別、值和運算子
型別 | 定義 |
IC
|
整數類型別 |
IL
|
整數類型別 |
值 | 定義 |
a | 型別為 IC 的物件 |
b | 型別為 IL 的物件 |
c | 整數型別的左值 |
x | 型別為 Int<IC> 的物件,表示與 a 相同的值 |
y | 型別為 Int<IL> 的物件,表示與 b 相同的值 |
運算子 | 定義 |
@= | 以下之一:+=、-=、*=、/=、%=、&=、|=、^=、<<= 和 >>= |
@ | 以下之一:+、-、*、/、%、&、|、^、<<、>>、&&、||、==、!=、<、>、<=、>=、<=> 和 , |
如果滿足指定條件,則以下表達式必須格式良好並具有其指定的結果和效果
表示式 | 條件 | 結果 | 效果 |
---|---|---|---|
a++ | 無條件 | 型別為 IC 的純右值,其值在求值前等於 a 的值 |
透過將 1 新增到 a 來修改 a 的值 |
a-- | 透過從 a 中減去 1 來修改 a 的值 | ||
++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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3366 (P2393R1) |
C++20 | 整數類型別與其對應的整數型別之間的轉換 未保證生成可表示值 |
已保證 |
LWG 3376 (P2393R1) |
C++20 | 整數類型別只能是類型別 | 也允許 非類型別 |
LWG 3467 | C++20 | bool 被視為整數類型別 | 已排除 |
LWG 3575 (P2393R1) |
C++20 | 整數類型別未保證是三向可比較的 | 已保證 |
[編輯] 參見
(C++20) |
指定一個semiregular 型別可以使用前置和後置增量運算子進行增量操作(概念) |