2
2
* cpp11[ meta cpp]
3
3
4
4
## 概要
5
- 「継承コンストラクタ (inheriting constructors)」は、基本クラスで定義したコンストラクタ群を 、派生クラスでそのまま使用できるようにするための糖衣構文である。
5
+ 「継承コンストラクタ (inheriting constructors)」は、基底クラスで定義したコンストラクタ群を 、派生クラスでそのまま使用できるようにするための糖衣構文である。
6
6
7
- 継承コンストラクタは、` using ` キーワードに続いて、基本クラス名とそのコンストラクタ名を ` :: ` 区切りで記述する:
7
+ 継承コンストラクタは、` using ` キーワードに続いて、基底クラス名とそのコンストラクタ名を ` :: ` 区切りで記述する:
8
8
9
9
``` cpp example
10
10
#include < string>
@@ -34,7 +34,7 @@ int main()
34
34
}
35
35
```
36
36
37
- 継承コンストラクタは、指定した基本クラスのコンストラクタ全てを暗黙に宣言するが 、一部のコンストラクタを明示的に宣言することを許可している:
37
+ 継承コンストラクタは、指定した基底クラスのコンストラクタ全てを暗黙に宣言するが 、一部のコンストラクタを明示的に宣言することを許可している:
38
38
39
39
```cpp
40
40
struct Derived : Base1, Base2 {
@@ -51,8 +51,8 @@ struct Derived : Base1, Base2 {
51
51
52
52
53
53
## 仕様
54
- - using宣言で基本クラスのコンストラクタを指定することで、基本クラスのコンストラクタ群を暗黙に宣言できる
55
- - 基本クラスの 、ひとつ以上のデフォルト引数を持つコンストラクタは、省略記号 ` ... ` があるバージョンとないバージョンの両方を派生クラスのコンストラクタ候補として宣言し、デフォルト引数を後ろから順番になくしたそれぞれのバージョンを派生クラスのコンストラクタ候補として宣言する
54
+ - using宣言で基底クラスのコンストラクタを指定することで、基底クラスのコンストラクタ群を暗黙に宣言できる
55
+ - 基底クラスの 、ひとつ以上のデフォルト引数を持つコンストラクタは、省略記号 ` ... ` があるバージョンとないバージョンの両方を派生クラスのコンストラクタ候補として宣言し、デフォルト引数を後ろから順番になくしたそれぞれのバージョンを派生クラスのコンストラクタ候補として宣言する
56
56
57
57
``` cpp
58
58
struct Base {
@@ -66,22 +66,22 @@ struct Derived : Base {
66
66
};
67
67
```
68
68
69
- - 基本クラスから引き継いだ各コンストラクタ候補は 、テンプレートパラメータリスト、パラメータの型リスト、`explicit`、`constexpr`、例外仕様もまた引き継ぐ
70
- - 基本クラスで `delete`宣言されたコンストラクタは、派生クラスでもまた`delete`宣言される
69
+ - 基底クラスから引き継いだ各コンストラクタ候補は 、テンプレートパラメータリスト、パラメータの型リスト、`explicit`、`constexpr`、例外仕様もまた引き継ぐ
70
+ - 基底クラスで `delete`宣言されたコンストラクタは、派生クラスでもまた`delete`宣言される
71
71
72
72
73
73
## この機能が必要になった背景・経緯
74
- 多くの場合、派生クラスのコンストラクタは、基本クラスと同じものを持つ 。そのため、派生クラスから基本クラスのコンストラクタに引数を転送するようお決まりのコードを書く必要があり 、これはうんざりするような作業だった。そのために、基本クラスから全てのコンストラクタを引き継ぐコードを簡単に書ける機能が必要とされ 、継承コンストラクタが導入されることとなった。
74
+ 多くの場合、派生クラスのコンストラクタは、基底クラスと同じものを持つ 。そのため、派生クラスから基底クラスのコンストラクタに引数を転送するようお決まりのコードを書く必要があり 、これはうんざりするような作業だった。そのために、基底クラスから全てのコンストラクタを引き継ぐコードを簡単に書ける機能が必要とされ 、継承コンストラクタが導入されることとなった。
75
75
76
76
77
77
## 検討されたほかの選択肢
78
78
継承コンストラクタの構文は、段階的にいくつかのバリエーションが考案された:
79
79
80
80
1. `using derived = base;` という構文で、`base`クラスのコンストラクタを`derived`クラスで使用できるようにする
81
81
2. `using default base;` という構文で、`base`クラスのコンストラクタを派生クラスからデフォルトで参照できるようにする
82
- 3. `base_constructors`キーワードを追加し、`using base_constructors;` という構文で、基本クラスのコンストラクタを派生クラスから使用できるようにする
82
+ 3. `base_constructors`キーワードを追加し、`using base_constructors;` という構文で、基底クラスのコンストラクタを派生クラスから使用できるようにする
83
83
84
- 最終的に、新しい構文やキーワードを導入することをやめ、既存のusing宣言構文に、各基本クラスのコンストラクタを指定することとなった 。
84
+ 最終的に、新しい構文やキーワードを導入することをやめ、既存のusing宣言構文に、各基底クラスのコンストラクタを指定することとなった 。
85
85
86
86
87
87
## 参照
0 commit comments