問題タブ [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.

0 投票する
3 に答える
200 参照

c++ - 「var{args}」で初期化するのはC++0xの新機能ですか、それとも単にシンタックスシュガーですか?

私はC++0xのよくある質問を読んでいて、初期化子リストの詳細を説明しているセクションに出くわしました。例は主に次のバリエーションでした。

ただし、次のフォームもリストされています。

この形式はよくある質問の他の場所にありますが、最初の2つの形式と意味的に異なるのか、それとも単に構文上の糖衣構文とは異なるのかについて興味がありvk({x, y, z})ます。

0 投票する
4 に答える
4188 参照

c++ - C++11 initializer_list を使用して std::array のようなコンテナーを実装する

唯一の非常に不便な注意点はstd::array、組み込みの C 配列のように初期化リストからそのサイズを推測できないことです。そのサイズはテンプレートとして渡す必要があります。

initializer_list を使用して std::array のようなコンテナー (組み込み C 配列の薄いラッパー) を実装することは可能C++11ですか?

std::array とは異なり、イニシャライザ リストから配列のサイズが自動的に推測されるため、より便利です。例えば:

初期化子リストが提供されていない場合は、サイズを指定するコンストラクターも提供する必要があります。例えば:

これにより、コンテナーは他の標準コンテナー (vector、deque、list など) とより一貫したものになります。

私の知る限り、T elems [size] などのラップされた C 配列は一定のサイズでなければならず、initializer_list の size() メンバー関数は一定ではないため、これは不可能です。

また、可変個引数テンプレートを使用してそのようなコンテナーを実装できるかどうか疑問に思っていましたが、私が読んだことからは可能ではないと思います。

0 投票する
2 に答える
2078 参照

c++ - サイズがstd::initializer_listのテンプレート引数ではないのはなぜですか?

std::initializer_listは中括弧で囲まれた初期化リストからコンパイラーによって構築され、このリストのサイズはコンパイル時定数でなければなりません。

では、なぜ委員会はテンプレートの引数からサイズを省略することにしたのでしょうか。これにより、一部の最適化が妨げられ、一部の処理が不可能になる可能性があります(std::arrayからの初期化std::initializer_list)。

0 投票する
4 に答える
172 参照

c++ - [c++]: コンストラクタの開始リストに関する問題

今まで考えたこともなかった質問に出くわしました。ここにあります:各オブジェクト(初期化リストにリストされている)の「コンストラクター」がトリガーされます。

次に、次のような出力を得ました。

出力によると、「A a(b)」が B のコピー コンストラクターをトリガーしたと思います。私が正しければ、それは 'A(B &b):_m(b)' が B のコピー コンストラクターをトリガーすることを意味します。なぜコンストラクタではなくコピーコンストラクタなのですか?

0 投票する
4 に答える
4261 参照

c++ - イニシャライザリスト-コピー不可能な(ただし移動可能な)オブジェクトのベクトルを構築する

コピーできpush_backないが移動可能なタイプの値をそのタイプのベクトルに再値付けすることができます。

ただし、同じ右辺値を使用してベクトルをinitializer-list-constructしようとすると、コピーコンストラクターが必要であるというエラーが発生します。

GCC4.7で次のエラーが発生します。

これは許可されるべきですか?許可されることに対する技術的な障害は見当たりませんが、現時点ではスタンダードを手元に置いていません...

0 投票する
2 に答える
430 参照

c++ - コンパイラ固有のプロキシに依存する C++11 ライブラリ機能

ある種のコンパイラ マジック (TM) に依存する特定の C++11 機能があることに、試行錯誤の結果、私の注意が向けられました。私は独自の標準準拠 stdlib の実装をいじっています。stdlib の実装がすぐに利用できることは知っていますが、これは小さなアプリケーション用の私自身のバージョンです。

昨夜std::initializer_list、私は仕様に従って実装しましたが、うまく機能させることができませんでした。高低の答えを探しましたが、それは不可能であり、コンパイラ自体に変更が必要であるという声明が残っていました. さて、私はそれの現在の実装を見てみることにしましたlibstdc++、そして確かに私の実装はデザインがまったく同じで、端がわずかに異なっているだけでした.のものと同じデザインlibstdc++です。名前空間 std にある必要があることに気付くまでに 6 時間かかりました。実装は、可能にするコンパイラへのプロキシであることが判明し、コンパイラ自体がクラスをinitializer_list検索しますinitializer_listnamespace std.

私の質問は、ある種の特別なコンパイラ マジックが機能すること、隠されたプロキシ接続を必要とすること、または新しい C++11 ライブラリ機能のいずれかのコンパイラ イントリスティックを秘密にすることを認識する必要がある他のライブラリ機能がもうないことです。これらを事前に知りたいので、コンパイラの魔法に依存する他の機能を実装するときに備えて、試行錯誤でそれを理解するために丸一日を無駄にするのではなく; これは退屈でかなり面倒になる可能性があります。

ありがとう。

0 投票する
2 に答える
190 参照

initialization - How to "reduce typing to create C++ types" with Uniform Initializers?

I have played a lot the new Uniform Initialization with {}. Like this:

It is undisputed that this initialization may change we program C++. But I wonder if I missed some of the magic possibilities when reading Alfonses's question in the Herb Sutter FAQs.

Alfonse: Uniform initialization (the use of {} to call constructors when the type being constructed can be deduced) has the potential to radically reduce the quantity of typing necessary to create C++ types. It's the kind of thing, like lambdas, that will change how people write C++ code. [...]

Can someone give me an example of what Alfonse exactly envisions here?

0 投票する
3 に答える
20154 参照

c++ - C ++:コンストラクター本体で割り当てられているポインターメンバーをNULLに初期化する必要がありますか?

私が持っているとしましょう:

MyClassコンストラクターのコンストラクター初期化リストでsomething_をNULL(または0)に初期化する必要がありますか?それとも、コンストラクターの本体で割り当てているので、それは必要ありませんか?推奨される方法は何ですか?

0 投票する
4 に答える
2949 参照

c++ - コンストラクター初期化リストからオーバーロードされたコンストラクターを呼び出す

以下のコードでは、 class のオブジェクトに渡される引数に基づいて、 kap(class )の 2 つのオーバーロードされたコンストラクターのいずれかを呼び出すことを意図しています。opacitymaterial

ただし、これは機能しません。

私が最初に試したのは、

同様の質問で指摘されているように、コンパイル時の理由から「三項演算子の結果は常に同じ型でなければならない」ため、失敗しました(ただし、そこでは説明されていないようです)。

さて、コンストラクターが受け取るべきMatter引数に基づいてコンストラクターをオーバーロードすることも、洗練されていない解決策になりますkapが、これは(1)特にMatterコンストラクターが多くの変数を取り、多くのアクションを実行するため、非常に洗練されていません (したがって、多くのコードがコンストラクターの初期化リストの一部を変更するためだけに複製されます)、(2)異なるコンストラクターを持つkap別のクラスが使用されている場合、これは手に負えなくなる可能性があります: N c'torsを持つMクラスの場合、1 つはNになります。 ^ Mの組み合わせ...Matter

誰かが提案や回避策を持っていますか? 前もって感謝します!

0 投票する
2 に答える
3792 参照

c++ - テンプレートは、初期化子リストのタイプを常に推測するとは限りません