問題タブ [member-initialization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - メンバー初期化リスト。引数評価の順序
メンバー初期化子リストを使用したコードの例。
次の評価順序が考えられる場合、メモリ リークが発生する可能性はありますか?
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) ブレース初期化リストが使用されている場合、コンストラクターのメンバー初期化子リスト内
別のケースがあります。
メンバー初期化子リストで引数評価の順序を定義するルールを提供できますか?
c++ - メンバー初期化子リストでの代入操作
次の Stack クラスがあります。
コピー コンストラクターの代入に注意してください。コードは機能し、正常にコンパイルされ、コンパイラ (gcc) は-Wall -Wextra
フラグを使用しても文句を言いません。コンパイラは自動的にコンパイラをこれに書き換えますか?
それとも何か別の魔法?定義の順序を変更すると、コンパイラが順序不同の初期化について不満を言うことに気付きました。だから私はそれが私が言ったケースだと思います。ドキュメントには何も見つかりませんでしたし、ASM の出力も役に立ちません。
c++ - 複雑な初期化コードを共有する複数の定数メンバー変数を初期化する方法は?
序章
この簡単な例を紹介しましょう。
トリビア
- 導入されたクラスには、 と の 2 つのメンバー変数が
A
ありB
ます。 - それらはそれぞれ
A ^ B + A
との値を取りますA ^ B + B
。 - どちらも共通の複雑な初期化コードを共有しています (複雑であると仮定しましょう
std::pow
)。
問題
A
とB
メンバー の両方を作りたいconst
です。
質問
複雑な初期化を繰り返さずにそれを行う方法 (つまり、2 回呼び出すのを避けるstd::pow
) は?
私が試したこと
struct Init
class の過去のバージョンの役割を担うように作成しますX
。- メンバーを作成し、
X
メンバーを非const
保持にします。Init
const
- コンストラクターの委任を使用して、コンストラクターの引数を にリダイレクトし
Init
ます。 - 非
const
メンバー変数を からInit
に移動X
して にしますconst
。- TriviallyCopyableがないことに注意して
std::move
ください。int
- TriviallyCopyableがないことに注意して
ただし、私の解決策は複雑すぎるようです。どんな助けでも大歓迎です。
ゴールなし
X
共通コードの結果を格納する別のメンバー変数を作成します (つまりstd::pow
)。- クラスの外に別のレベルの間接化を追加します
X
(たとえば、 の基底クラスを導入しX
ます)。
ノート
ソリューションでは、C++11 よりも新しいバージョンの C++ を使用できます。
c++ - 標準のどの部分が、インプレース メンバーとイニシャライザ リストの優先順位を決定しますか?
私の個人的な観点からは、コンパイルしないか、少なくとも警告を表示する必要があるサンプルを作成しましたが、Visual Studio 2017 は警告を表示しません。サンプルは次のとおりです。
私の観点からは (ただし、私は言語弁護士ではありません)、foo の 2 つの初期化 (インプレースと初期化子リスト) はあいまいです。では、この場合のルールは何ですか?