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 ✅