問題タブ [initializer-list]
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++ - copy-list-initializationが明示的なコンストラクターを許可した場合、何がうまくいかない可能性がありますか?
C ++標準§13.3.1.7[over.match.list]では、次のように記述されています。
copy-list-initializationでは、
explicit
コンストラクターが選択されている場合、初期化の形式が正しくありません。
これが、たとえば次のようなことができない理由です。
(ここで行われるのは変換ではなく、コンストラクターが「暗黙的」であったとしても変換されないことに注意してください。これはfoo
、コンストラクターを直接使用したオブジェクトの初期化です。以外はstd::string
、ここでは変換はありません。)
これは私には完全に問題ないようです。暗黙の変換が私を噛む方法はありません。
{ "answer", 42 }
他の何かを初期化できる場合、コンパイラは私を裏切って間違ったことをしません:
問題はありません。呼び出しがあいまいで、コードがコンパイルされないため、オーバーロードを明示的に選択する必要があります。
禁止事項が明記されているので、ここで何かが足りない気がします。私が見る限り、明示的なコンストラクターを選択するリスト初期化は私には問題のようには思えません。リスト初期化構文を使用することにより、プログラマーはすでにある種の「変換」を実行したいという願望を表明しています。
何がうまくいかない可能性がありますか?私は何が欠けていますか?
c++ - C++ コンストラクターへの参照渡し。メンバーは完全なプライベート コピーになりますか?
C++ には、 class のオブジェクトを受け入れるコンストラクターがありますdescriptor
。このクラスは最近サイズが大きくなったため、さらに参照渡しする必要があります。次のctorに参照渡しすると、参照型として宣言されていない場合でも、メンバーは独自のコピーを作成しますか?
また
c++ - 共用体内で`initializer_list`ctorを使用して構造体を作成しますか?
私はPODである構造体を持っていますが、便宜上、std::initializer_list
ctorが必要です。デフォルトのctor、copy ctor、およびdtorは暗黙的です。initializer_list
ただし、 ctorを使用すると、構造体がPODとして不適格になるため、ユニオン内に含めることはできません。
gcc 4.6 --std = c ++ 0x:
その周りにありますか?これは、c ++ 11の無制限のユニオン機能に関連していますか?
c++ - コンストラクターで配列を初期化するにはどうすればよいですか?
重複の可能性:
C++ のクラス初期化子で const 配列を初期化する
ブール値の配列であるメンバー変数を持つクラスがある場合、コンストラクターの初期化子リストで配列をすべて false 値に初期化するにはどうすればよいですか? それとも、デフォルトですべて false に初期化されますか?
c++ - 初期化リストと割り当てのオーバーロード (演算子 =)
代入演算子のオーバーロードは初期化子リストに伝播しますか?
たとえば、次のクラスがあるとします。
そしてコンストラクタ:
初期化子リストは代入演算子のオーバーロードを解決しstd::string
ますか? そうでない場合、回避策はありますか?
特にGCCの場合。
c++ - 抽象基本クラスの保護されたメンバーをどのように初期化しますか?
おそらく私は何も心配していません。私は、データ メンバーが RAII のイディオムに厳密に従うことを望んでいます。抽象基本クラスの保護されたポインター メンバーを null に初期化するにはどうすればよいですか?
null であることはわかっていますが、それが普遍的に理解されるようにした方がよいのではないでしょうか?
初期化コードを初期化子リストの外に置くと、実行されない可能性があります。このポインターをスタックに割り当てるためのアセンブリ操作の観点から考えると、マルチスレッド環境で (c'tor 本体と同じように) 中断することはできませんか、それともスタック拡張はアトミックであることが保証されていますか? デストラクタの実行が保証されている場合、プロセッサがアトミックに実行しなくても、スタック拡張にはそのような保証がないのでしょうか?
このような単純な質問が、どうしてこれほど広範に及ぶようになったのでしょうか? ありがとう。
すばらしい std:: ライブラリを避けることができれば、私はミニマリストの環境にいます。
c++ - constexpr を使用して再帰的に定義された型で C++11 initializer_list を使用する
C++11 を使用して、コンストラクターを使用して、以下のinitializer_list
ような再帰的に定義されたクラスをアセンブルすることは可能ですか?Foo
constexpr
Foo<3>
次を使用して初期化できます。
代わりに Foo<3> a = {1,2,3} を使用するとよいでしょう。constexpr tail
機能があれば、initializer_list
うまくいくはずです。
c++ - なぜ 'std::vectorb{2};' 2要素ベクトルではなく、1要素ベクトルを作成しますか?
ここ数日、C++11 をいじっていて、奇妙なことを思いつきました。
int を均一に初期化したい場合:
しかし、std::vector に対して同じことを行うと、次のようになります。
2 要素の配列を構築するのではなく、値 2 の 1 つの要素を持つ配列を構築します。それについてもっと明確にする必要があるという効果が得られるようです:
しかし、b の宣言とは異なります。これは矛盾しているようです。私は同じ効果を持つ他のものを見てきました。私が尋ねているのは、この動作は最終的な C++11 標準での動作ですか、それとも初期に実装されたドラフトだけでしょうか? もしそうなら、なぜ標準化委員会はこの動作を含めたのですか? どのクラスがイニシャライザ リスト コンストラクタを持っているかを覚えておく必要があり、それらのクラスだけで {} の代わりに古い () 構文を使用する必要があるため、均一な初期化の目的全体が無効になっているようです。または、均一な初期化を完全に放棄します。
これは大きな「落とし穴」のようです。しかし、私が気づいていない利点があるかもしれません。
編集:このコード:
gcc 4.6.2 で「2」を出力する
c++ - ヒープに割り当てられた構造体の初期化子リスト
Visual Studio 2008 C ++プロジェクトがあり、構造体をヒープ割り当てし、初期化子リストを使用して初期化します。
これを行う方法はありますか?
c++ - インライン コンストラクターは C++ で初期化リストを使用できますか?
API のソース コードを調べていたところ、初期化リストが使用されていないことに気付きました。これは、代わりにコンストラクタ本体に移動されました。これは最適ではないと思いましたが、これらのコンストラクターがインラインであることに気付きました。
インラインコンストラクターで初期化リストを使用する場合、いくつかの制限はありますか? 10倍