問題タブ [list-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++ - unique_ptr を使用した関数呼び出しでのブレースの初期化による自動型推定の失敗
bar ( { new int } );
以下のコードを考えると、 unique_ptrと Bar の違いは何ですか?foo( { new int } );
clang 3.5 でのコンパイル エラー:
c++ - ={} と {} スタイルの初期化は C++11 で同じですか?
C++11 では、{} スタイルの初期化が導入されました。しかし、これらの2つの形式は
同じ?
c++ - c++11 のブレース初期化に効率の問題はありますか?
中規模のコード ベースを常にブレース初期化を使用するようにリファクタリングすることを検討しています。知っておくべき効率の問題はありますか?
いくつかの例は、POD 型と組み込み型である可能性があります。多くの構築パラメータを持つ大きなクラスはどうでしょうか?
c++ - リストの初期化とコピー省略
次の例を検討してください。
8.5.16 (C++11 標準の) によると、次の行
として扱われます
(つまり、タイプ A の一時オブジェクトが作成され、タイプ A の copy-ctor に渡されて x が初期化されます)。次に、12.8.31 に従って、コンパイラーは「コピー省略」と呼ばれる最適化を実行して、型 A の一時的な作成を排除し、そのコード行を効果的に
(つまり、一時的に作成されず、copy-ctors が呼び出されません)。
ここで、上記の例で次のようにリストの初期化を使用するとします。
また
(1)および/または(2)が常に(つまり、コンパイラが「コピー省略」最適化を実行できる場合だけでなく)
(つまり、A の最初のコンストラクターが直接呼び出され、一時オブジェクトは作成されず、型 A のオブジェクトのコピーは実行されません)。
c++ - 配列のデフォルトとリストの初期化
配列のような構造を簡略化した次のコードがあります。
これは、clang 3.3 および gcc 4.8.1 で正常にコンパイルされ、両方とも-std=c++11
. gcc をアップグレードしようとしているので、今は 4.9.0 を試しています。この場合、3 番目の例 ( ) はのコンストラクター ( ) をERROR (1)
インスタンス化し、その時点でコンパイラーは報告します。X
ERROR (2)
z
この最後の例では、配列とそれに含まれる配列をデフォルトで初期化しようとしています。ただし、これが正しい場合、ここで gcc は基本的に、含まれている配列が によってリスト初期化されていることを示しています{}
。これは、コンストラクターが明示的であるため許可されていません。
次のいずれかの形式の別のデフォルト コンストラクターを追加すると、エラーはなくなります。
しかしそうではない
この回避策は難しいものではありませんが、誰が間違っていて誰が正しいのか、私が何をしているのか、そしてその理由を知るためにはどうすればよいでしょうか?
c++11 - ブレースの初期化と派生クラスから基本クラスへの共有ポインターのキャスト
ブレースの初期化を使用して、派生クラスへの多数の共有ポインターを使用して、基本クラスへの共有ポインターのベクトルを初期化しようとしています。コードは (無関係な詳細を取り除いた後) 次のようになります。
このコードを Visual Studio 2013 でコンパイルしてコンソールで実行すると、結果は次のようになります。
その後、プログラムがクラッシュします。std::shared_ptr<Derived>
これは予想されることであり、ブレースの初期化はへの暗黙の変換と互換性がありませんstd::shared_ptr<Base>
か、それとも Visual Studio のバグですか? ブレースの初期化は、内部で共有ポインターの変換をブロックする魔法を行いますか (ポインターへの参照の取得など)?
c++11 - 均一な初期化を使用するのは危険ではありませんか?
数日前に均一な初期化を発見しました。誰もが可能な限りそれを使用する必要があることをどこでも見ています。
しかし、この新しい構文は価値があるよりも面倒だと思わずにはいられません...
最初の例
次のような構造体を持つライブラリを作成するとします。
ユーザーは、集計の初期化を使用して次のように書くことができます。
ここで、ライブラリを更新し、構造体が次のようになったとしましょう。
C++11 より前では、ユーザー コードはコンパイルを停止し、ユーザーはコードを書き直してコンストラクターを使用する必要がありました。しかし今、コードはコンパイルされ、均一な初期化として解釈されます:
ユーザーが知らないうちに、ライブラリを更新すると、コードが非常に異なることを行うようになります!
2 番目の例
さて、私のライブラリにこのようなクラスがあるとしましょう:
ユーザーは次のように使用できます。
または、次のように均一な初期化を使用します。
繰り返しになりますが、ライブラリを更新するとしましょう。クラスは次のようになります。
古典的なコンストラクタが使用された場合、問題はありません:
ただし、均一な初期化が呼び出された場合、コードの解釈は変わります:
これらの例に基づいて、ユーザーが均一な初期化を使用することは非常に危険であるように思われます。使用されるライブラリに何かが追加されると、コードの解釈がまったく警告なしに変更される可能性があるためです。
さらに悪いことに、均一な初期化の導入により、集約の初期化が危険なものになります。
私は何かを逃しましたか?均一な初期化の使用が安全で便利なコンテキストはありますか?