問題タブ [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++11 - コピーリストの初期化と一時的な直接リストの初期化
次の構造体があるとします。
次の出力:
は:
次の出力中:
は:
2つの違いを理解しようとして、最初のケースはコピーリスト初期化を使用しているのに対し、2番目のケースは名前のない一時的な直接リスト初期化を使用していることを特定したと思います(ここではそれぞれ7番と2番) : http://en.cppreference.com/w/cpp/language/list_initialization )。
同様の質問を検索すると、これが見つかりました:なぜ標準は直接リストの初期化とコピーリストの初期化を区別するのですか? そしてこれ:コピーリストの初期化は概念的にコピーctorを呼び出しますか?.
これらの質問に対する回答では、コピー リストの初期化の場合、明示的なコンストラクターを使用するとコードの形式が崩れるという事実について説明しています。実際、ABC のデフォルト コンストラクターを明示的にすると、最初の例はコンパイルされませんが、それは (おそらく) 別の問題です。
では、問題は次のとおりです。最初のケースでは一時的にコピーされたのに、2 番目のケースでは移動されたのはなぜですか? copy-list-initialization の場合、移動を妨げているのは何ですか?
注意として、次のコード:
また、ABC のムーブ コンストラクターが呼び出されます (コピー コンストラクターは呼び出されません) が、別のメカニズムが関与する場合があります。
https://ideone.com/Kc8xInでコードを試すことができます (C++14 モードで gcc-4.9.2 を使用) 。
c++ - std::map メンバー コンパイラ エラーのブレース初期化
次のコードは、Visual Studio 2013 を使用してコンパイルされません。Xcode 6.1 (Clang 3.5) を使用してコンパイルされます。
両方の宣言で報告されるエラーは次のとおりです。
ただし、以下はコンパイルされます。
誰かこれを説明してください。
c++ - C++11: リスト初期化でユーザー定義オブジェクトに値を割り当てる方法は?
クラス Library があり、別のクラス Shelf のメンバー オブジェクト Shelf1 が含まれています。
Class Shelf にはいくつかの変数があります。
Library では、Library 宣言でメンバー オブジェクト shelf1 を初期化します。
それらは機能しますか? また、リストの初期化は変数の順序に対してどのように機能しますか?
[更新] これらのコードは、私の質問を説明するためのものです (実世界にも同様のコードがありますが、ここに置くには複雑すぎるため、質問を単純化します)。
c++ - このプログラムは、C++14 では問題なくコンパイルできるのに、C++11 コンパイラではコンパイルできないのはなぜですか?
私は最近、オンライン コンパイラで次の簡単なプログラムをテストしました。ここでライブ デモを参照してください。正常にコンパイルされ、期待される出力が得られますが、Dev C++ IDE でテストすると、コンパイル中に失敗します。
これが私のプログラムです:
次のエラーが表示されます。
コードブロック13.12 IDEでも試してみましたが、Dev C++と同じエラーが発生します。
これは C++14 の新しい機能ですか? C++11 コンパイラで動作しないのはなぜですか?
c++ - C++11 ブレース初期化構文を使用して、単純な集計の自明なコンストラクターの宣言を回避できますか?
次のコードがあるとします。
そして今、一時的なものを明示的に作成せずFoo
に、特定のものを使用してベクターに新しいアイテムを追加したいと考えています。つまり、次のコンストラクターを追加する必要があります。tag
code
Foo
そして今、私は使用できますemplace_back
:
しかし、新しく作成した構造体を使用して、これを 100 回も行う必要があったとき、ブレース初期化子を使用できないのではないかと考えました。そのようです:
これによりコンパイル エラーが発生します ('initializer-list' から 'Foo' に変換できません)。
c++ - コンパイラが auto+brace スタイルの初期化を最適化できるのはいつですか?
次のように定義された Product というクラスがあるとします。
そして、次のように変数を初期化します。
標準では、コンパイラが論理的に次のことを行う必要があると規定されていると思いました。
- 一時的な製品を構築する
- move-construct p (一時的な Product を使用)
しかし、p が直接構築されるように、コンパイラーがこれを最適化することが許可されていること。
私はこれを検証しました (Visual Studio 2013)。実際、独自のカスタム (既定ではない) ムーブ コンストラクターがある場合でも、コンパイラはこれを最適化します。これで問題ありません。
ただし、次のように、コピー コンストラクターとムーブ コンストラクターを明示的に削除すると、次のようになります。
auto+brace の初期化は引き続きコンパイルされます。コピーまたは移動が許可されていないため、コンパイラはこれを防止する必要がありました。
次のように、削除されたコピー コンストラクターとムーブ コンストラクターを非公開にすると、非常に奇妙です。
その後、auto+brace の初期化はコンパイラを実行しなくなります。
これは予想される動作ですか?これは Visual Studio 2013 (Update 3) のバグですか?
注: 私はideoneでこれをコンパイルしようとしましたが、コピー コンストラクターとムーブ コンストラクターが削除された (および公開された) ときに初期化をコンパイルすることを実際に拒否します。これは Visual Studio のバグだと思います。
c++ - ブレースで初期化された一時をアドレスで渡すには、MSVS で同じ型に明示的にキャストする必要があるのはなぜですか?
Windows API を扱うときに、似ていない 2 ライナーを置き換えることで、コードの肥大化を抑えようとしていました。
ワンライナー付き
しかし、エラーに遭遇しました:
式は、左辺値または関数指定子でなければなりません。
多くの試みの後、最終的にコンパイルするコードを思いつきました( MSVS 2013u4 ):
キャストが必要な理由をよりよく理解するために、簡単なテスト プロジェクトをセットアップしました。
一部の構造体T
に明示的なコンストラクターがある場合(A
上記のコードのように)、ブレースで初期化された一時的な型のアドレスを取得T
し、それをポインターを取る関数に渡すことができることがわかりましたT*
が、そうでない場合( のような)がB
ある場合、上記のエラーが発生し、 type への明示的なキャストによってのみ克服できますT
。
問題は、なぜ がB
そのような奇妙なキャストを必要とし、A
そうでないのかということです。
アップデート
rvalue を lvalue として扱うことは MSVS の拡張機能/機能/バグであることが明らかになったので、実際に機能であるふりをしたい人はいますか (2010 年以降、MS がそれを維持するのに十分に使用されていますA
) B
。コンパイラを満足させるためにさまざまな方法で?AのコンストラクターとBのコンストラクターの欠如と関係があるに違いありません...
c++ - C++ / JNI ブレースで囲まれた初期化子マップ (Android NDK)
AndroidStudio の JNI と統合するために C++ でエンジンを記述しています。見つけたすべてのチュートリアルを読んで従います。
Cppファイルには、そのように初期化された中括弧で囲まれた2つのマップを含むヘッダーのインポートがあります(単なる例):
最初のものは2500行で初期化されています... 2番目のものはそのようなものです:
アプリケーション.mk
そして、ここにエラーがあります:
jni/My_header.h:line: エラー: '{{state_one, "State 1"}, {state_two, "State 2"}..} を '< ブレースで囲まれた初期化子リスト>' から 'std:: map< StateEnum, std::string>'
また、c++ ファイルをライブラリにコンパイルしてから、それを Android プロジェクトに統合しようとしました。そして結果は同じです。
誰でも私を助けることができます。2500 行のマップ初期化 (map.add(...) を使用) を 5000 行に変換したくありませんでした。