問題タブ [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++ - コンパイラのブレース初期化リストは、型 `std::initializer_list` とどの程度密接に結合されていますか?
C++ ヘッダーなしで同じ効果を達成できます<initializer_list>
か?
class initializer_list
住む必要がありますかnamespace std
(コンパイラはこれを必要としますか)?
ビッグ ファイブ (GCC、MSVC、Intel、Clang、Comeau) で動作するソリューションで問題ありません
c++ - C++のテンプレート引数を介してクラスコンストラクターを渡します
関数が引数を渡すことができることは知っていますがtemplate
、このようにクラスコンストラクターを渡すことはできますか?
更新:
これを実行したい理由は、メモリプールでコンストラクターを選択でき、割り当てたいクラス(この場合class A
)でコードを変更する必要がないためです。
c++ - iostream オブジェクトを割り当てまたはコピーできませんか?
iostream
と他のストリームクラスは実際にはクラスではなくtypedef
、 s ですよね?
ここに問題がありistream
ます。初期化リストでオブジェクトを初期化しようとしましたが、残念ながらエラーが発生しました。コードは次のようになります。
g++ でコンパイルできません。エラー:
SOを検索したところ、iostream cannot be assigned or copy
. しかし、なぜ初期化リストで初期化できないのでしょうか?
私が思うに、初期化リストはオブジェクトのコンストラクター/コピーコンストラクターを呼び出しますよね?
c++ - データを initializer_list として std::array の構造体に渡すことは可能ですか?
次のコードがあります。基本的に、集計初期化構文を使用して、POD 以外の構造体の std::array を初期化したいと考えています。g++ 4.6 と 4.7 (最新の週次スナップショット) の両方がコードのコンパイルに失敗します。
GCC エラー:
私の質問: 上記のコードは正しいですか? std::array は集約であるため、そのデータ メンバーを構築するのに問題はないようです。多分それはGCCのバグですか?
編集:
OtherClass<2>{{ TheClass{1, 2}, TheClass{2, 3} }};
もちろん機能しますが、多くの場所でクラスを構築する必要があるため、それを使用したくありません。C++11 は の省略をサポートする必要がありTheClass
ます。この質問も参照してください。
c++ - C++からの奇妙なコードセグメント
他の投稿からコードを読んで、私はこのようなものを見ています。
この場合、特に中括弧に関して、mem(0){}は何をしますか?私はこれまでこれを見たことがなく、これについて他にどこで見つけることができるかわかりません。mem(0)がmemを0に初期化することは知っていますが、なぜ{}なのですか?
ありがとう。
c++ - #含む範囲ベースの初期化子リストを使用する必要がありますか?
<iterator>
最終的なC++11標準には、他のヘッダーを含めることなく、ネイティブ配列に対して「正しく機能する」ための範囲ベースの規定が含まれています。これは、私が知る限り、コメントUK 78および79の結果として、ワーキングペーパーn2900で最初に取り上げられました。
この提案には、すべての翻訳ユニットに暗黙的に含める条項も含まれている#include <initializer_list>
ため、たとえばプログラム
を含めなくても標準に準拠し<initializer_list>
ます。
ただし、概念がC ++ 11から削除されると、n2930に見られるように、範囲ベースのforが改訂されました。配列が「正しく機能する」という規定は残っていますが、初期化子リストにも同じことが当てはまるという言及はありません。実際、さまざまな標準ライブラリコンテナヘッダーの仕様と#include <initializer_list>
8.5.4.2の最終テキストは、私とは反対のことを暗示しています。
私の知る限り、これはトピックの最終的な表現にかなり近いものです。それで、上記のプログラムは最終的な標準に関して整形式#include <initializer_list>
ですか、それとも範囲ベースでそれを使用する必要がありますか?言い換えると、範囲ベースの初期化子リストの使用はstd::initializer_list
、FDISの8.5.4.2による「タイプが指定されていない暗黙の使用でさえも---の使用」を構成しますか?
c++ - ブルース・エッケルの624ページの「Thinkingin C ++」に関する次のコメント(太字)を理解していませんでした。1
「コンストラクターはデフォルトのコンストラクターではないことに注意してください。それぞれにint引数があります。引数自体には識別子がありません。存在する唯一の理由は、初期化子リストでコンストラクターを明示的に呼び出すように強制することです。」
c++ - 数学ベクトルクラスを初期化子リスト対応にする
次のように設計された数学ベクトルクラスがあります。
以前は、スタック上にVector3D型変数を作成するために以下を使用していました。
イニシャライザリストコンストラクタを実装することで、C ++ 0xでこれを短縮できると聞いたので、次のように書くことができます。
これを実装する正しい方法は何ですか?
アップデート
中括弧の構文は、このクラスの箱から出してすぐに機能します。答えとコメントをありがとう!
また、コンストラクター初期化子リストがコンストラクターでのメンバー変数の割り当てよりも高速化されるかどうかを測定するために、いくつかの合成パフォーマンステストを実行しました。以下は、g++4.6.1で得られた結果です。
現状のまま(コンストラクターとカスタムコピーコンストラクターでのメンバーの割り当て):
/li>コンストラクター初期化子リストとカスタムコピーコンストラクターの使用:
/li>コンストラクター初期化子リストとデフォルトのコピーコンストラクターの使用:
/li>
結論のいくつか:
- 上記の数学ベクトルクラスの場合、コンストラクター初期化子リストはメンバー変数の割り当てを高速化しません。
- カスタムコピーコンストラクターは、デフォルトのコピーコンストラクターよりも35%以上高速です。
c++ - std::array 初期化子リスト 初期化リストでの初期化
私は C++11 の新機能を大いに楽しんでいますが、その微妙な点のいくつかが欠けているように感じることがあります。
int 配列の初期化は正常に機能し、Element2 ベクトルの初期化は正常に機能しますが、Element2 配列の初期化は失敗します。正しい構文はコメントされていない行であるべきだと思いますが、初期化の試みはどれも成功しませんでした。
MinGWの下でg ++ 4.6.1および4.6.2でこれを試しました。
この配列を正しく初期化するにはどうすればよいですか? 出来ますか?