- concepts[meta header]
- concept[meta id-type]
- std[meta namespace]
- cpp20[meta cpp]
namespace std {
template<class T>
concept default_initializable = /*see below*/;
}
- see below[italic]
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>;
- constructible_from[link /reference/concepts/constructible_from.md]
#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");
}
- std::default_initializable[color ff0000]
int is default initializable
S is not default initializable
- C++20
- Clang: ??
- GCC: 10.1 [mark verified]
- Visual C++: 2019 Update 3 [mark verified]