タグ付けされた質問 「initializer-list」

6
コンストラクター初期化子でのメンバー配列の初期化
class C { public: C() : arr({1,2,3}) //doesn't compile {} /* C() : arr{1,2,3} //doesn't compile either {} */ private: int arr[3]; }; 理由は、配列は=構文でのみ初期化できるためです。つまり、 int arr[3] = {1,3,4}; ご質問 やりたいことを行うにはどうすればよいですか(つまり、コンストラクターで配列を初期化します(本体の要素を割り当てません))。それも可能ですか? C ++ 03標準は、ctor初期化子での集約(配列を含む)の初期化に関して特別なことを言っていますか?または、上記のコードの無効性は他のいくつかのルールの当然の結果ですか? C ++ 0x初期化リストは問題を解決しますか? PS私がよく知っているベクトル、boost :: array、および配列に対するその優位性については言及しないでください。


8
initializer_listおよび移動セマンティクス
から要素を移動することはできstd::initializer_list<T>ますか? #include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // kosher? } } 以来std::intializer_list<T>、特別なコンパイラの注意を必要とし、C ++標準ライブラリの通常のコンテナのような値のセマンティクスを持っていない、私はむしろ後悔するより安全であると聞いて思います。

6
std :: initializer_listが組み込み言語ではないのはなぜですか?
std::initializer_listコア言語が組み込まれていないのはなぜですか? これはC ++ 11の非常に重要な機能であり、独自の予約済みキーワード(または同様のもの)がないように思えます。 代わりに、initializer_listそれはだだけで、特別な、暗黙の持っている標準ライブラリのテンプレートクラスのマッピング新しいからブレース-のinit-リスト {...}コンパイラによって処理の構文を。 最初は、このソリューションはかなりハックです。 これは、C ++言語への新しい追加が実装される方法ですか?コア言語ではなく、いくつかのテンプレートクラスの暗黙のロールによって? これらの例を検討してください: widget<int> w = {1,2,3}; //this is how we want to use a class 新しいクラスが選ばれた理由: widget( std::initializer_list<T> init ) これらのアイデアのいずれかに類似したものを使用する代わりに: widget( T[] init, int length ) // (1) widget( T... init ) // (2) widget( std::vector<T> init ) // (3) 古典的な配列、おそらくconstあちこちに追加できます …

5
移動のみのタイプのベクターをリスト初期化できますか?
GCC 4.7スナップショットを介して次のコードを渡すと、unique_ptrsをベクターにコピーしようとします。 #include <vector> #include <memory> int main() { using move_only = std::unique_ptr<int>; std::vector<move_only> v { move_only(), move_only(), move_only() }; } std::unique_ptrはコピーできないため、明らかに機能しません。 エラー:削除された関数の使用 'std :: unique_ptr <_Tp、_Dp> :: unique_ptr(const std :: unique_ptr <_Tp、_Dp>&)[with _Tp = int; _Dp = std :: default_delete; std :: unique_ptr <_Tp、_Dp> = std :: unique_ptr] ' …

3
ブレースで囲まれたイニシャライザをいつ使用するのですか?
C ++ 11では、クラスを初期化するための新しい構文を使用して、変数を初期化する方法を数多く提供しています。 { // Example 1 int b(1); int a{1}; int c = 1; int d = {1}; } { // Example 2 std::complex<double> b(3,4); std::complex<double> a{3,4}; std::complex<double> c = {3,4}; auto d = std::complex<double>(3,4); auto e = std::complex<double>{3,4}; } { // Example 3 std::string a(3,'x'); std::string b{3,'x'}; // …


3
1つの関数呼び出しC ++を使用して複数の定数クラスメンバーを初期化する
2つの異なる定数メンバー変数があり、どちらも同じ関数呼び出しに基づいて初期化する必要がある場合、関数を2回呼び出さずにこれを行う方法はありますか? たとえば、分子と分母が定数である分数クラス。 int gcd(int a, int b); // Greatest Common Divisor class Fraction { public: // Lets say we want to initialize to a reduced fraction Fraction(int a, int b) : numerator(a/gcd(a,b)), denominator(b/gcd(a,b)) { } private: const int numerator, denominator; }; これにより、GCD関数が2回呼び出されるため、時間が無駄になります。新しいクラスメンバーを定義し、gcd_a_b最初にgcdの出力を初期化リストのそれに割り当てることもできますが、これによりメモリが無駄になります。 一般に、関数呼び出しやメモリを無駄にせずにこれを行う方法はありますか?初期化リストに一時変数を作成できますか?ありがとうございました。

6
無害な範囲ベースのforループが機能しない
以下はコンパイルされません: #include <iostream> int main() { int a{},b{},c{},d{}; for (auto& s : {a, b, c, d}) { s = 1; } std::cout << a << std::endl; return 0; } ゴッドボルトで試してみてください コンパイラエラーは次のとおりです。 error: assignment of read-only reference 's' 今私の実際の場合、リストはクラスのメンバー変数で構成されています。 これで、式がinitializer_list<int>実際にa、b、c、およびdをコピーするになるため、これは機能しません。したがって、変更もできません。 私の質問は2つあります。 このように範囲ベースのforループを記述できないようにする動機はありますか? 例えば。おそらく、裸のブレース式の特別なケースがあるかもしれません。 このタイプのループを修正する構文上のきちんとした方法は何ですか? この線に沿ったものが好ましいでしょう: for (auto& s : something(a, b, …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.