struct
の省略形の定義で、問題点のみを示しています。構造体宣言で空のカッコはどういう意味ですか?
struct Entry {
// bookkeeping record for managing solution search
std::array<std::array<bool, DIM>, DIM> filled; // which holes have been filled
std::array<std::array<char, MAX>, MAX> cells; // individual cell entries, 0=empty
std::vector<Constraint> overlaps;
std::vector<Hole*>::iterator candidates;
Entry() = default;
};
これは実際には間違いでした。私は、デフォルトのコンストラクタが配列を0で初期化すると思っていましたが、ランダムなガベージでそれらを埋めています。私は今、デフォルトのコンストラクタを書く必要があることを知っていますが、私はテスト時に遭遇した動作に混乱しています。
は、これは私のテスト関数のカットダウン版です:私はこれを実行したとき
void testEntry(void) {
Entry e;
std::cout << std::boolalpha;
e.cells[1][2] = 'a';
e.filled[0][0] = true;
for (int i = 0; i < MAX; ++i)
for (int j = 0; j < MAX; ++j)
std::cout<<i<<" "<<j<<" "<<e.cells[i][j]<<std::endl;
for (int i = 0; i < DIM; ++i)
for (int j = 0; j < DIM; ++j)
std::cout<<i<<" "<<j<<" "<<e.filled[i][j]<<std::endl;
}
、filled
とcells
配列はランダムなゴミを含有し、最終的に私は私のミスを発見しました。デバッグ中に、Entry e;
という宣言をEntry e{};
に変更し、変更されたコードが意図したとおりに動作するように見えますが、理由はわかりません。
私はその文書に従うことができません。 list initializationの下では、 "braced-init-listが空で、Tがデフォルトのコンストラクタを持つクラス型である場合、値の初期化が実行されます。"これはかなり明確ですが、私がvalue initializationに行くと、ケースのどれが適用されるのか分かりません。 zero-intializationの下のこの句のように思われる "Tが非共用体のクラス型である場合、すべての基本クラスと非静的データメンバーはゼロで初期化され、すべての埋め込みはゼロビットに初期化されます。いずれも無視されますが、私はここに来る方法は分かりません。
何よりも、この動作が実際に仕様で定義されているのか、それとも別のコンパイラで異なるのか疑問です。 (私はXcode 7.2.1の下でclangを使用しています)。
"Tが、ユーザ提供も削除もされないデフォルトのコンストラクタを持つクラス型である場合(つまり、暗黙的に定義されたデフォルトコンストラクタを持つクラスである場合)、オブジェクトはゼロで初期化され、 " – cpplearner
あなたはこの質問にC++ 11というタグを付けましたが、C++ 11やC++ 14に興味があるだけですか?私が間違っていなければ、C++ 14はこの集計の初期化を行います。 – hvd
'[...]' ==かっこ、 '(...)' ==かっこ、 '{...}' ==中かっこ。あなたのコードは3つすべてを持っていて、あなたはタイトルの中だけに「大括弧」と書いてあります。質問が何であるかを理解するために不必要に難しい作業をしなければなりません。デフォルトのコンストラクタは配列に「ランダムなジャンク」を埋め込むわけではありません。まったく何もしません。ランダムなジャンクは、使用されたメモリの中にあったものです。 – Clifford