Skip to content

Commit b094b24

Browse files
committed
is_defaulted, is_deleted : 対象範囲がまちがっていたのを修正
1 parent 3058e20 commit b094b24

2 files changed

Lines changed: 63 additions & 16 deletions

File tree

reference/meta/is_defaulted.md

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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
3141
int 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

reference/meta/is_deleted.md

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,47 @@ namespace std::meta {
1212
* info[link info.md]
1313
1414
## 概要
15-
`= delete`されているかを判定する。
15+
削除関数(規格上の[deleted function](https://eel.is/c++draft/dcl.fct.def.delete#def:function,deleted))であるかを判定する。
16+
17+
削除関数には、以下が含まれる:
18+
19+
- `= delete`を明示的に付加して宣言された関数
20+
- 暗黙的にdeleteされる関数(例えば、deleteされた基底クラスの特殊メンバ関数によって、派生クラスで暗黙的に対応する特殊メンバ関数がdeleteされる場合)
21+
- `= default`を明示的に付加して宣言されたが、結果としてdeleteされる関数(例えば、基底クラスのムーブコンストラクタがdeleteされている状態で、派生クラスで`= default`指定されたムーブコンストラクタ)
1622
1723
1824
## 戻り値
19-
`r`が`= delete`された関数を表す場合に`true`を返す。
25+
`r`が削除関数を表す場合に`true`を返す。
2026
2127
2228
## 例
2329
```cpp example
2430
#include <meta>
2531
26-
struct NonCopyable {
27-
NonCopyable() = default;
28-
NonCopyable(const NonCopyable&) = delete;
32+
struct B {
33+
B(const B&) = delete;
34+
B(B&&) = delete;
35+
};
36+
37+
struct S : B {
38+
S() = delete; // 明示的にdelete宣言された関数: 削除関数
39+
// S(const S&); // 暗黙的に宣言されるが基底のdeleteにより削除関数とみなされる
40+
S(S&&) = default; // 明示的にdefault宣言だが、基底クラスのdeleteにより削除関数とみなされる
2941
};
3042
3143
int main() {
3244
template for (constexpr auto m :
33-
std::define_static_array(std::meta::members_of(^^NonCopyable, std::meta::access_context::unchecked()))) {
34-
if constexpr (std::meta::is_copy_constructor(m)) {
45+
std::define_static_array(std::meta::members_of(^^S,
46+
std::meta::access_context::unchecked()))) {
47+
// S()、S(const S&)、S(S&&)はいずれも削除関数
48+
if constexpr (std::meta::is_constructor(m)) {
3549
static_assert(std::meta::is_deleted(m));
3650
}
3751
}
3852
}
3953
```
40-
* std::meta::is_copy_constructor[link is_copy_constructor.md]
54+
* std::meta::is_deleted[color ff0000]
55+
* std::meta::is_constructor[link is_constructor.md]
4156
* std::meta::members_of[link members_of.md]
4257
* std::meta::access_context[link access_context.md]
4358
* unchecked[link access_context/unchecked.md]
@@ -53,7 +68,7 @@ int main() {
5368

5469
### 処理系
5570
- [Clang](/implementation.md#clang): ??
56-
- [GCC](/implementation.md#gcc): ??
71+
- [GCC](/implementation.md#gcc): 16 [mark verified]
5772
- [Visual C++](/implementation.md#visual_cpp): ??
5873

5974

0 commit comments

Comments
 (0)