struct X {};
struct Y {
Y() = default;
X& x;
};
C++11 では正常に動作します。Y::x が実際に舞台裏でどのように初期化されるか知りたいですか?
デフォルトにする必要があることを明示的に示してもY()
、コンパイラーは特定の条件下でデフォルトのコンストラクターを削除する義務があります (強調を追加)。
8.4.2/4 明示的にデフォルト設定された関数
明示的にデフォルト化された関数と暗黙的に宣言された関数はまとめてデフォルト化された関数と呼ばれ、実装はそれらの暗黙的な定義を提供する必要があります (12.1 12.4、12.8)。これは、それらを削除済みとして定義することを意味する場合があります。
と
12.1/5 コンストラクタ:
...
... クラス X のデフォルトのデフォルト コンストラクタは、次の場合に削除済みとして定義されます。
- ブレースまたはイコール初期化子を持たない非静的データ メンバーは参照型です。
ただし、実際に使用しようとしない限り、削除された関数またはコンストラクターを定義してもエラーにはなりません。
8.4.3/2 削除された定義
宣言する以外に、削除された関数を暗黙的または明示的に参照するプログラムは、形式が正しくありません。
Y オブジェクトを作成しないと「機能」します。作成すると、エラーが発生します。
(GCC 4.8.0)
エラー: '構造体 Y' の参照メンバーが初期化されていません