問題タブ [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++ - gcc 4.8 での静的 constexpr メンバー配列の初期化
次のコードは、-std=c++11 を使用すると、gcc 4.9.1 および clang-3.6 でコンパイルおよび実行されます。
ただし、gcc 4.8.3 では失敗し、エラー メッセージが表示されます。
ちなみに、同じことをしbars
て static const グローバル配列を作成すると、gcc 4.8 と clang で正常にコンパイルされます。リスト内の各整数リテラルを追加の のペアで囲むと、問題なくコンパイルされます{}
。
これは gcc 4.8 のバグですか? 標準は、これに適した構文は何だと言っていますか? 余分な中括弧を省略した場合、C++11 統一初期化標準のどの部分が呼び出されますか?
編集:標準では、これにより集約の初期化が呼び出され、「ブレースの省略」が可能になると規定されているようです。したがって、gcc 4.9 で修正された gcc 4.8 のバグのようですが、標準を読む自信がまったくありません。また、これに関する gcc のバグ トラッカーでバグ レポートが見つからないように見えるので、簡単に間違っている可能性があります。
c++ - C++11 配列の初期化でコピー コンストラクターが呼び出されない
サイズに合わせてテンプレート化された配列を使用する小さなクラスを作成しています。ここにいくつかのコードがあります...
.hpp
.cc
combo{sequence}
コンストラクタのメンバ初期化では、型しか受け付けないのでイニシャライザとして使えませんsf::Keyboard::Key
。を要求している場合、これは理にかなっていますinitializer_list
が、これは奇妙に思えます。他の標準コンテナーでは、{} 表記を使用してコピー コンストラクターを呼び出すことができます。これはとの癖std::array
ですか?それとも私のclangのバグですか?
念のため、私のclangバージョンは次のとおりです。
c++ - 基本型の統一初期化?
これらの定義を基本型に使用することは良い習慣ですか?
関数定義と間違えやすい。
c++ - C++ での初期化の明確化
次の例では本当に混乱しています。
それはうまく機能し、期待される結果をもたらします。しかし、上記のコードを以下のように変更すると。
上記のプログラムでは、コンパイラで複数のエラーが表示されます。最初のプログラムでは均一な初期化が許可されているのに、2番目のプログラムでは許可されていないのはなぜですか? どこが間違っていますか?
c++ - この C++ C11 構文は何ですか: "= {}"?
C++ファイルでこの構文に出くわしました:
それは何をするためのものか?デフォルトのコンストラクターを呼び出すだけですか?
c++ - 明示的なコピー コンストラクターと均一な初期化
明示的なコピー コンストラクターは、 のようなものを許可せずFoo foo = bar;
、コピーの使用を として強制しますFoo foo(bar);
。さらに、明示的なコピー コンストラクターでは、関数から値でオブジェクトを返すこともできません。ただし、コピーの初期化を中かっこに置き換えてみました。
エラーが発生しています(g ++ 5.2)
エラー: 'Foo::Foo(Foo&)' の呼び出しに一致する関数がありません
または (clang++)
エラー: 構造体初期化子に余分な要素があります
を削除explicit
するとコードが g++ でコンパイル可能になりますが、clang++ は同じエラーで失敗します (@Steephen に感謝)。何が起きてる?均一な初期化は、初期化子リスト コンストラクターと見なされますか (他のすべてのコンストラクターより優先されます)。しかし、その場合、コピー コンストラクターが明示的でない場合にプログラムがコンパイルされるのはなぜでしょうか。
c++ - 一様な初期化と std::initializer_list
私はC++を学んでいて、リストの初期化について読んでいるところまで来ました。少し混乱した後、構文の重複が原因で、一様な初期化とリストの初期化は、C++ 11 の新機能 (重複しているとはいえ) は実際には 2 つの異なるものであることがわかりました。ですから、質問をする前に要約したいと思います。何か間違っている場合は訂正してください (このトピックについて何かが誤解される前に..)
組み込み型に関する限り、それらを初期化するための構文は次のとおりです (読みやすくするために int を想定しています)。
ここで興味深いのは、集約型 (配列と集約構造体) の均一な初期化を使用することです。C++11 までは、リスト初期化子を使用して配列と集約クラスを初期化できました。
これで、新しい標準により、統一された初期化に新しい構文を使用できることがわかりました。
これは、コンストラクターのメンバー初期化リストで使用する場合に便利です。
そして今、クラスの種類に。クラスが initializers_list コンストラクターを定義していない場合:
クラスが class_type::class_type(const std::initializer_list&) コンストラクターを定義すると、他のコンストラクターよりも優先されることを知っています (空のリストであり、デフォルトのコンストラクターが優先される場合を除きます)。
さて、私の質問は次のとおりです。
波括弧リストで使用すると何が=
変わるのですか? 私が考えることができる唯一の違いは、init リスト コンストラクターが明示的かどうかです。
と同じ
コピーの初期化の暗黙の変換が関係していますか?それは唯一の違いですか?
明らかに間違ったことを言っている場合は、訂正してください。
c++ - なぜ std::string{"const char ptr"} が機能するのですか?
initializer_list
std :: string には CTOR が 1 つしかないことがわかりstring (initializer_list<char> il);
ます。なぜstd::string{"some_str"}
機能するのconst char*
ですか?