メンバー初期化子リストを使用したコードの例。
#include <memory>
struct Throwable
{
Throwable()
{
throw "Exception!";
}
};
struct A
{
A() : t(Throwable()), i(new int()) {}
Throwable t;
std::unique_ptr<int> i;
};
次の評価順序が考えられる場合、メモリ リークが発生する可能性はありますか?
new int()
Throwable()
t()
i()
標準の順序は何ですか? いくつかのルールがあります。
https://en.cppreference.com/w/cpp/language/initializer_list
3) 次に、非静的データ メンバがクラス定義の宣言順に初期化されます。
そのt
ため、前に構築されi
ます。
https://en.cppreference.com/w/cpp/language/eval_order
9) 組み込みコンマ演算子の最初 (左) の引数の
,
すべての値の計算と副作用は、2 番目 (右) の引数のすべての値の計算と副作用の前に並べられます。
ただし、前の参照のため、メンバー初期化子リストはすべてのコンマ規則を使用していません。また、コンマ演算子ではありません ( https://en.cppreference.com/w/cpp/language/operator_other#Built-in_comma_operator )。
10) リスト初期化では、与えられた初期化子句のすべての値の計算と副作用は、中括弧で囲まれたカンマ区切りの初期化子のリストでそれに続くすべての初期化子句に関連付けられたすべての値の計算と副作用の前に並べられます。
そしてhttps://en.cppreference.com/w/cpp/language/list_initialization
リストの初期化は、次の状況で実行されます。
5) ブレース初期化リストが使用されている場合、コンストラクターのメンバー初期化子リスト内
別のケースがあります。
メンバー初期化子リストで引数評価の順序を定義するルールを提供できますか?