最終更新日時: 2026年04月06日 11時49分40秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<stdckdint.h>

# ckd_sub(C++26)

    template<class type1, class type2, class type3>
    bool ckd_sub(type1* result, type2 a, type3 b);

## 概要

検査付きの整数の減算を行う。`a - b`を計算し、結果を`result`が指す先に格納する。オーバーフローが発生した場合は`true`を返す。

C言語の`<stdckdint.h>`で定義される関数であり、C++においてはC互換性のために提供される。C言語では型総称マクロ (type-generic macro) として定義されるが、C++では関数テンプレートとして提供される。

## テンプレートパラメータ制約

- `type1`、`type2`、`type3`はいずれも符号付き整数型または符号なし整数型であること

## 戻り値

`a - b`の数学的な結果が`type1`で表現可能な範囲を超える場合 (オーバーフロー) は`true`を返し、そうでなければ`false`を返す。

## 効果

`a - b`の数学的な結果を`type1`に変換した値を`*result`に格納する。

## 例

    #include <stdckdint.h>
    #include <cassert>
    #include <climits>

    int main() {
      int result = 0;

      // オーバーフローしない場合
      bool overflow = ckd_sub(&result, 1, 2);
      assert(!overflow);
      assert(result == -1);

      // オーバーフローする場合
      overflow = ckd_sub(&result, INT_MIN, 1);
      assert(overflow);
    }

### 出力

## バージョン

### 言語

- C++26

### 処理系

- Clang: 21 ✅
- GCC: 15 ✅
- Visual C++: 2026 Update 2 ❌

## 参照

- N2683 Towards Integer Safety
- P3370R1 Add new C headers as C++ headers