[解決済み] C++11の新しい構文「= default」について
質問
なぜ、こんなことをするのか理解できない。
struct S {
int a;
S(int aa) : a(aa) {}
S() = default;
};
と言えばいいのでは。
S() {} // instead of S() = default;
なぜ新しい構文を持ち込むのか?
どのように解決するのですか?
デフォルト化されたデフォルトコンストラクタとは、具体的には、初期化リストがなく、複合文が空であるユーザー定義のデフォルトコンストラクタと同じものであると定義されています。
§12.1/6 [クラス.コンテナ] を参照してください。 defaulted であり deleted と定義されていないデフォルトコンストラクタは、そのクラス型のオブジェクトを作成するために odr-used されたとき、または最初の宣言の後に明示的に defaulted されたときに暗黙的に定義されます。暗黙的に定義されたデフォルトコンストラクタは,ctor-initializer (12.6.2) がなく,空の複合文のあるそのクラスに対してユーザが書いたデフォルトコンストラクタが実行するであろうクラスの初期化集合を実行する。[...]
しかし、どちらのコンストラクタも同じ動作をしますが、空の実装を提供すると、クラスのいくつかのプロパティに影響を与えます。ユーザー定義のコンストラクタを指定すると、何もしないにもかかわらず、その型が
アグリゲート
でなく、また
トリビアル
. クラスを集約型やトリビアル型(あるいは推移性によって POD 型)にしたい場合は,以下のようにします.
= default
.
<ブロッククオート§8.5.1/1 [dcl.init.aggr]の項参照。 集約は、ユーザーが提供するコンストラクタを持たない配列またはクラスで、[and...]です。
§12.1/5 [クラス.コンテナ]編 デフォルトのコンストラクタは、ユーザが提供するものでなければ些細なものであり、[...]です。
§9/6 [クラス]の場合 つまらないクラスとは、つまらないデフォルトコンストラクタと [...] を持つクラスのことです。
実証すること。
#include <type_traits>
struct X {
X() = default;
};
struct Y {
Y() { };
};
int main() {
static_assert(std::is_trivial<X>::value, "X should be trivial");
static_assert(std::is_pod<X>::value, "X should be POD");
static_assert(!std::is_trivial<Y>::value, "Y should not be trivial");
static_assert(!std::is_pod<Y>::value, "Y should not be POD");
}
さらに、コンストラクタを明示的にデフォルトにすることで、それを
constexpr
を指定すると、暗黙のコンストラクタが持っていたのと同じ例外仕様が与えられます。この例では、暗黙のコンストラクタは
constexpr
(データメンバを初期化しないままにしてしまうため)また、例外の仕様も空になってしまうので、違いはありません。しかし、そうです、一般的なケースでは、手動で
constexpr
と例外仕様が暗黙のコンストラクタに一致するようにします。
使用方法
= default
は、コピー/ムーブコンストラクタとデストラクタでも使用できるため、ある程度の統一性をもたらします。たとえば、空のコピー コンストラクタは、デフォルトのコピー コンストラクタ(メンバ単位でコピーを実行する)と同じことはできません。このため
= default
(または
= delete
という構文に統一することで、コードを読みやすくすることができます。
関連
-
[解決済み】構造体のベクター初期化について
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】C++の余分な資格エラー
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] 配置換え」にはどんな使い方があるのか?
-
[解決済み] C++11でRule-of-ThreeがRule-of-Fiveに?[クローズド]
-
[解決済み】クラスの関数宣言の後の "default "の意味とは?
-
[解決済み】デフォルトのコンストラクタとデストラクタの「=default」は「{}」とどう違うのですか?