タグ付けされた質問 「aggregate-initialization」

6
コンストラクター初期化子でのメンバー配列の初期化
class C { public: C() : arr({1,2,3}) //doesn't compile {} /* C() : arr{1,2,3} //doesn't compile either {} */ private: int arr[3]; }; 理由は、配列は=構文でのみ初期化できるためです。つまり、 int arr[3] = {1,3,4}; ご質問 やりたいことを行うにはどうすればよいですか(つまり、コンストラクターで配列を初期化します(本体の要素を割り当てません))。それも可能ですか? C ++ 03標準は、ctor初期化子での集約(配列を含む)の初期化に関して特別なことを言っていますか?または、上記のコードの無効性は他のいくつかのルールの当然の結果ですか? C ++ 0x初期化リストは問題を解決しますか? PS私がよく知っているベクトル、boost :: array、および配列に対するその優位性については言及しないでください。

3
プライベートコンストラクターがプライベートコンストラクターではないのはいつですか?
タイプがあり、そのデフォルトのコンストラクタをプライベートにしたいとします。私は次のように書きます: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); // …

8
C ++ 0xでの変換の絞り込み。それは私だけですか、それともこれは壊滅的な変化のように聞こえますか?
C ++ 0xは、aから。へのいわゆるナローイング変換を必要とするため、次のコードおよび同様のコードを不正な形式doubleにしintます。 int a[] = { 1.0 }; この種の初期化が実際のコードで多く使用されているかどうか疑問に思います。この変更によっていくつのコードが壊れますか?コードがまったく影響を受けている場合、コードでこれを修正するのは大変な努力ですか? 参考までに、n3225の8.5.4 / 6を参照してください。 ナローイング変換は暗黙的な変換です 浮動小数点型から整数型へ、または long doubleからdoubleまたはfloat、またはdoubleからfloat。ただし、ソースが定数式であり、変換後の実際の値が表現可能な値の範囲内にある場合(正確に表現できない場合でも)、または ソースが定数式であり、変換後の実際の値がターゲットタイプに適合し、元のタイプに変換されたときに元の値を生成する場合を除いて、整数型またはスコープなしの列挙型から浮動小数点型へ、または 整数型またはスコープなしの列挙型から、元の型のすべての値を表すことができない整数型へ。ただし、ソースが定数式であり、変換後の実際の値がターゲット型に適合し、次の場合に元の値を生成する場合を除きます。元のタイプに変換されます。

5
集計初期化メンバーの脱落を防ぐことはできますか?
このような同じタイプの多くのメンバーを持つ構造体があります struct VariablePointers { VariablePtr active; VariablePtr wasactive; VariablePtr filename; }; 問題は、次のように構造体メンバーの1つ(例:)を初期化し忘れた場合ですwasactive。 VariablePointers{activePtr, filename} コンパイラはそれについて文句を言うことはありませんが、部分的に初期化されたオブジェクトが1つあります。この種のエラーを防ぐにはどうすればよいですか?コンストラクタを追加することはできますが、変数のリストを2回複製するため、これをすべて3回入力する必要があります。 C ++ 11の解決策がある場合は、C ++ 11の回答も追加してください(現在、そのバージョンに制限されています)。ただし、最近の言語標準も歓迎します。

4
集約の初期化のために空の基本クラスを非表示にする
次のコードを検討してください。 struct A { // No data members //... }; template<typename T, size_t N> struct B : A { T data[N]; } これは、Bを初期化する方法ですB<int, 3> b = { {}, {1, 2, 3} }; 。基本クラスの不要な空の{}を避けたいのです。ここでJarod42によって提案された解決策がありますが、要素のデフォルトの初期化では機能しません。B<int, 3> b = {1, 2, 3};問題B<int, 3> b = {1};はありませんが、デフォルトb.data[1]でb.data[2]はありません。デフォルトで0に初期化されていないため、コンパイラエラーが発生します。基本クラスを構築から「隠す」方法はありますか(またはc ++ 20で存在するでしょう)?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.