@@ -12,32 +12,64 @@ namespace std::meta {
1212* info[link info.md]
1313
1414## 概要
15- `= default`されているかを判定する。
15+ デフォルト関数(規格上の[defaulted function](https://eel.is/c++draft/dcl.fct.def.default#def:defaulted))であるかを判定する。
16+
17+ デフォルト関数には、以下が含まれる:
18+
19+ - `= default`を明示的に付加して定義された関数
20+ - 暗黙的に宣言される特殊メンバ関数(デフォルトコンストラクタ、コピー/ムーブコンストラクタ、コピー/ムーブ代入演算子、デストラクタ)
21+ - 暗黙的に宣言される比較演算子
1622
1723
1824## 戻り値
19- `r`が`= default`された関数を表す場合に `true`を返す。
25+ `r`がデフォルト関数を表す場合に `true`を返す。
2026
2127
2228## 例
2329```cpp example
2430#include <meta>
2531
26- struct S {
27- S() = default;
28- S(int) {}
32+ // すべての特殊メンバ関数が暗黙的に宣言される
33+ struct Implicit {};
34+
35+ // 明示的に= defaultされる
36+ struct Explicit {
37+ Explicit() = default;
38+ Explicit(int) {}
2939};
3040
3141int main() {
3242 template for (constexpr auto m :
33- std::define_static_array(std::meta::members_of(^^S, std::meta::access_context::unchecked()))) {
43+ std::define_static_array(std::meta::members_of(^^Implicit,
44+ std::meta::access_context::unchecked()))) {
45+ // Implicitクラスの暗黙宣言されたデフォルトコンストラクタ等もデフォルト関数となる
46+ if constexpr (std::meta::is_default_constructor(m)) {
47+ static_assert(std::meta::is_defaulted(m));
48+ }
49+ }
50+
51+ template for (constexpr auto m :
52+ std::define_static_array(std::meta::members_of(^^Explicit,
53+ std::meta::access_context::unchecked()))) {
3454 if constexpr (std::meta::is_default_constructor(m)) {
55+ // 明示的な= default指定された関数もデフォルト関数
3556 static_assert(std::meta::is_defaulted(m));
3657 }
58+ if constexpr (std::meta::is_constructor(m)
59+ && !std::meta::is_default_constructor(m)
60+ && !std::meta::is_copy_constructor(m)
61+ && !std::meta::is_move_constructor(m)) {
62+ // ユーザー定義コンストラクタはデフォルト関数ではない
63+ static_assert(!std::meta::is_defaulted(m));
64+ }
3765 }
3866}
3967```
68+ * std::meta::is_defaulted[ color ff0000]
4069* std::meta::is_default_constructor[ link is_default_constructor.md]
70+ * std::meta::is_constructor[ link is_constructor.md]
71+ * std::meta::is_copy_constructor[ link is_copy_constructor.md]
72+ * std::meta::is_move_constructor[ link is_move_constructor.md]
4173* std::meta::members_of[ link members_of.md]
4274* std::meta::access_context[ link access_context.md]
4375* unchecked[ link access_context/unchecked.md]
@@ -53,7 +85,7 @@ int main() {
5385
5486### 処理系
5587- [ Clang] ( /implementation.md#clang ) : ??
56- - [ GCC] ( /implementation.md#gcc ) : ??
88+ - [ GCC] ( /implementation.md#gcc ) : 16 [ mark verified ]
5789- [ Visual C++] ( /implementation.md#visual_cpp ) : ??
5890
5991
0 commit comments