[解決済み] なぜC++はconstオブジェクトをデフォルトで構築するために、ユーザが提供するデフォルトコンストラクタを必要とするのでしょうか?
疑問点
C++の規格(8.5項)には、以下のように書かれています。
プログラムが const-qualified型Tのオブジェクトのデフォルト初期化を呼び出す場合、Tはユーザが提供するデフォルトコンストラクタを持つクラス型でなければならない。
なぜでしょうか?この場合、ユーザ提供のコンストラクタが必要な理由が思いつきません。
struct B{
B():x(42){}
int doSomeStuff() const{return x;}
int x;
};
struct A{
A(){}//other than "because the standard says so", why is this line required?
B b;//not required for this example, just to illustrate
//how this situation isn't totally useless
};
int main(){
const A a;
}
どのように解決するのですか?
これは(すべてのバージョンの規格に対して)欠陥とみなされ、次のようにして解決されました。 コアワーキンググループ (CWG) 不具合 253 . 規格の新しい文言では http://eel.is/c++draft/dcl.init#7
以下の場合、クラス型Tはconst-default-constructibleです。 T のデフォルト初期化でユーザが提供するコンストラクタが呼び出される場合や を呼び出す場合、または、(基底クラスから継承されていない)
- T の各直接非変数非静的データメンバー M がデフォルトメンバー初期化子を持つか、M がクラス型 X(またはその配列)である場合、X が const-default-constructible である場合。
- T が少なくとも一つの非静的データメンバを持つユニオンである場合、ちょうど一つのバリアントメンバがデフォルトメンバイニシャライザを持つ。
- T がユニオンでない場合、少なくとも一つの非静的データメンバを持つ各匿名ユニオンメンバ (もしあれば) に対して、正確に一つの非静的データ メンバはデフォルトメンバイニシャライザを持ち
- T の各潜在的に構築された基底クラスは const-default-constructible である。
のオブジェクトのデフォルト初期化を要求する場合,Tはconst-default-constructibleクラスでなければならない。 のオブジェクトのデフォルト初期化を要求する場合,Tはconst-default-constructibleなクラス型またはその配列でなければならない。 型またはその配列でなければなりません。
この文言は、本質的に明白なコードが機能することを意味します。すべてのベースとメンバを初期化すれば、次のようになります。
A const a;
と言うことができます。これは、どのように、あるいはどのようなコンストラクタを綴るかに関係なく、です。
struct A {
};
A const a;
gcc は 4.6.4 からこれを受け入れています。clang は 3.9.0 からこれを受け入れています。Visual Studio もこれを受け入れています (少なくとも 2017 年、もっと早いかどうかは不明)。
関連
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】C++の余分な資格エラー
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】Enterキーを押して続行する
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む