問題タブ [uniform-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++ - C ++で均一な初期化を使用するには、デフォルトのコンストラクターが必須ですか
以下のコードでは、「デフォルトのコンストラクターがありません」というエラーメッセージが表示されました。そのため、均一な初期化子を使用できません。
デフォルトのコンストラクターを作成すると、中かっこに関するエラーが発生しました。
このプログラムと均一な初期化子に関する問題を強調してください。
VS 2012 と C++ を使用しています
c++11 - 均一な初期化を使用するのは危険ではありませんか?
数日前に均一な初期化を発見しました。誰もが可能な限りそれを使用する必要があることをどこでも見ています。
しかし、この新しい構文は価値があるよりも面倒だと思わずにはいられません...
最初の例
次のような構造体を持つライブラリを作成するとします。
ユーザーは、集計の初期化を使用して次のように書くことができます。
ここで、ライブラリを更新し、構造体が次のようになったとしましょう。
C++11 より前では、ユーザー コードはコンパイルを停止し、ユーザーはコードを書き直してコンストラクターを使用する必要がありました。しかし今、コードはコンパイルされ、均一な初期化として解釈されます:
ユーザーが知らないうちに、ライブラリを更新すると、コードが非常に異なることを行うようになります!
2 番目の例
さて、私のライブラリにこのようなクラスがあるとしましょう:
ユーザーは次のように使用できます。
または、次のように均一な初期化を使用します。
繰り返しになりますが、ライブラリを更新するとしましょう。クラスは次のようになります。
古典的なコンストラクタが使用された場合、問題はありません:
ただし、均一な初期化が呼び出された場合、コードの解釈は変わります:
これらの例に基づいて、ユーザーが均一な初期化を使用することは非常に危険であるように思われます。使用されるライブラリに何かが追加されると、コードの解釈がまったく警告なしに変更される可能性があるためです。
さらに悪いことに、均一な初期化の導入により、集約の初期化が危険なものになります。
私は何かを逃しましたか?均一な初期化の使用が安全で便利なコンテキストはありますか?
c++ - 統一された初期化構文を使用した初期化子リストによるクラス内メンバーの初期化?
MSVC2013で以下をコンパイルしようとしています:
コンパイラは私に次のエラーを与えます:SomeClass::SomeStruct::SomeStruct: no overloaded function takes 3 arguments.
コードを次のように変更すると:
プログラムはコンパイルされ、正常に実行されます。これはコンパイラの問題ですか、それとも構文を理解していませんか? 私が読んでいることから、最初のバージョンはコンパイルされるはずです。
c++ - イテレータの均一な初期化
私は C++11 に非常に慣れていないので、反復子と一様な初期化に問題があり、理解できません。
コンパイルされない次の例を考えてみましょう。
6 行目では、均一な初期化を使用してベクトルが初期化されます。7 行目では、イテレータで同じことをしようとしています。それは動作しません。7 行目を変更してauto iter = t.begin()
も問題ありません。これには単に「範囲ベース」を使用できることはわかっていますが、問題は、イテレータでは一様な初期化が機能しないのに、のような基本型では問題ないのはなぜint i{0};
ですか?
c++ - Object obj(args...) と Object obj{args...} の違いは何ですか?
Scott Meyers によるドラフト本「Effective C++11 」には、次のように記載されています。
オブジェクトの作成時に () と {} を区別する
Object obj(args...)
とはどう違いObject obj{args...}
ますか?なぜスコットがそう言うのか。
アップデート:
質問C++11 統一初期化構文の使用方法は? は HOW を尋ね、この質問は WHY を尋ねます。
更新 2:
次のリンクが役に立ち、この質問に完全に答えています。
c++ - 削除されたコピー コンストラクターによる const 参照メンバーの初期化
このコードは、削除されたコピー コンストラクターを含む にconst A& a
メンバーがB
ありA
、GCC 4.8.1 ではコンパイルされませんが、clang 3.4 では問題なく動作します。
正しいコンパイラはどれですか?
GCC のエラーは次のとおりです。
イデオネ: http://ideone.com/x1CVwx
c++ - アトミック構造体の均一な初期化?
編集: どちらもg++{{1, 2}}
で({1, 2})
動作し、clang では動作しません。clang の回避策はありますか?
c++ - C++11 で統一された初期化構文
C++11 の「統一された初期化構文」についての質問です。
C++11 の次の構文で構造体を初期化することは合法ですか (行番号 128 ~ 137 を参照)。それともPODはまだ実在するのですか?
MSVC 2013 コンパイラの問題。この例は正常にコンパイルされますが、不適切な関数呼び出しの例外でクラッシュします。std::function オブジェクトが正しく初期化されていないことがわかりました。
ちなみに、ICC 13.0 は例のコードをコンパイルできません。
example.cpp(130): エラー #2084: 指定子は非 POD (Plain Old Data) サブオブジェクトを指定できない可能性があります
コンパイラの欠陥ですか?または、コンパイラではすべて問題ありませんが、そのようなアプローチは C++11 に準拠していませんか?
ここに短い例があります: