最終更新日時: 2025年07月14日 23時12分05秒 (JST)
Koichi Murase が更新

履歴 編集

concept
<concepts>

# std::default_initializable(C++20)

    namespace std {
      template<class T>
      concept default_initializable = see below;
    }

## 概要

`default_initializable`は、任意の型`T`がデフォルト構築可能であること表すコンセプトである。

## 要件

まず、説明専用の変数テンプレート`is-default-initializable<T>`を、型`T`について`T t;`のような変数定義が有効である場合に`true`を示す変数テンプレートとして定義する。

    template<class T>
    inline constexpr bool is-default-initializable;

`default_initializable`コンセプトは以下のように定義される。

    template<class T>
    concept default_initializable = constructible_from<T> &&
                                    requires { T{}; } &&
                                    is-default-initializable<T>;

## 例

    #include <iostream>
    #include <concepts>

    template<std::default_initializable T>
    void f(const char* name) {
      std::cout << name << " is default initializable" << std::endl;
    }

    template<typename T>
    void f(const char* name) {
      std::cout << name << " is not default initializable" << std::endl;
    }

    struct S {
      S() = delete;

      S(int m) : n(m) {}

      int n = 0;
    };

    int main() {
      f<int>("int");
      f<S>("S");
    }

### 出力

    int is default initializable
    S is not default initializable

## バージョン

### 言語

- C++20

### 処理系

- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 3 ✅

## 関連項目

- C++20 コンセプト
- `is_default_constructible`

## 参照

- P0898R3 Standard Library Concepts
- P1754R1 Rename concepts to standard_case for C++20, while we still can
- LWG Issue 3149. DefaultConstructible should require default initialization