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 ✅