問題タブ [rvalue-reference]
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 - ムーブ代入の場合、破壊が右辺値に残されていると、メモリリークが発生しますか?
このMSDNの記事を参照すると、最後に(セクション:ロバストプログラミング)、次のように記載されています。
リソースリークを防ぐために、ムーブ代入演算子で常にリソース(メモリ、ファイルハンドル、ソケットなど)を解放してください。
代わりにムーブ代入が次のように実装された場合はどうなりますか。
「他の」参照の右辺値の「_data」は、スコープ外になると解放されませんか?
c++ - C++11 - 右辺値ポインターの区別
変数をコンパイラで構築された文字列として区別するにはどうすればよいですか?
たとえば、右辺値"Hello, World"
の型はconst char*
. const char*
それ自体は、ポインターを変更できないという意味ではありません。ポインターを変更するchar* const
ことはできませんが、それはコンパイラーによって構築されるものではありません。
これは、 を保持するコンテナconst char*
の場合、C++ の移動セマンティクス以外の方法でデータをコピーする必要があるということですか? コンパイラで構築された文字列を移動し、他のすべての文字列をそのままにしておく方法はありますか?
たとえば、GCC 4.5.2 では、 ではint
なく型を返すメソッドは、 を返すint&
ものとして扱われint&&
ます。実際の標準がこのようになっているかどうかはわかりませんが、GCC が当分の間そうしていることです。
編集:明確にするために、ポインタが指す実際のメモリをコピーする必要があることを意味します。これは、新しいメモリを割り当てる必要があり、ポインターからのデータを新しい場所にコピーする必要があることを意味します。
c++ - multimap::emplace() と move() とは?
multimap に関する MSDN ドキュメントを表示していたところ、メンバー関数 multimap::emplace() があることがわかりました。以下は、そのメンバー関数の例です。
emplace()
とmove()
は C++0x のようです。誰かが私のためにそれらを説明できますか? について読みましmove()
たが、それが何をするのか(ボンネットの下で)本当にわかりません。
c++ - C ++ 11でのT&&(ダブルアンパサンド)とはどういう意味ですか?
私はC++11の新機能のいくつかを調べてきましたが、気付いたのは、のような変数を宣言する際の2つのアンパサンドですT&& var
。
まず、この獣は何と呼ばれていますか?Googleがこのような句読点の検索を許可してくれることを願っています。
正確にはどういう意味ですか?
一見、ダブルリファレンス(CスタイルのダブルポインタのようにT** var
)のように見えますが、そのユースケースを考えるのに苦労しています。
c++11 - C ++ 0x右辺値参照の前方定義でIDを使用するのはなぜですか?
右辺値参照の簡単な紹介ではforward
、次のように定義されています。
identity
クラスはどのような目的を果たしますか?なぜだめですか:
c++ - move セマンティクス std::move 使用方法
このコードがコンパイルされないのはなぜですか?
エラー C2440: 'return': 'int &&' の 'int' を変換できません
c++ - 右辺値参照パラメーターとテンプレート関数
右辺値参照パラメーターを受け入れる関数を定義すると、次のようになります。
GCC 4.5 を使用してa
、 、ar
、またはのいずれかで呼び出すことができarr
ます。
ただし、同様の非テンプレート関数を呼び出すと、
これら 3 つの引数のいずれを使用しても失敗します。の知識を強化する準備をしていたのforward
ですが、これでコースから外れてしまいました。おそらくそれは GCC 4.5 です。A Brief Introduction to Rvalue Referencesの最初の例でもコンパイル エラーが発生することに驚きました。
c++ - クラス内のメソッドに対する `= delete` の正しい使用
次のスニペットは、それ以外の方法で生成されたクラスのメソッドとコンストラクターをすべて定義解除するのに正しいですか?
これにより、すべてのデフォルトのコンパイラ実装が削除され、デストラクタだけが残りますよね? それがなければ、クラスは(ほとんど)使用できないと思いますが、削除することもできますよね?
Picture&
move-assignの戻り値の型はoperator=(Picture&&)
正しいですか? Picture&&
戻り値の型について書いた場合、違いはありますか?
c++ - コピーできないオブジェクトをstd-containersに入れる
このクラスの設計は、コピーと割り当てを防ぎ、クライアントコードを偶発的な二重削除から保護するための標準のC ++ 0xの方法data
ですか?
ここで新しいmoveメソッドとmove-assignメソッドを定義したことに気づきました。それらを正しく実装しましたか?
移動と移動割り当ての定義を使用DataHolder
して、標準のコンテナーに入れる方法はありますか?のようにvector
?どうすればいいですか?
いくつかのオプションが思い浮かびます。
ここemplace_back
では、アイデアは単なる推測です。
編集:読者の便宜のために、回答をサンプルコードにまとめました。
c++ - RValue 参照 (&&) の戻り値が役立つ場合はありますか?
関数が RValue Reference を返さなければならない理由はありますか? テクニック、トリック、イディオム、パターン?
私は一般的に参照を返すことの危険性を認識していますが、とにかくそれを行うこともありますよね? T& T::operator=(T)
は慣用的な例の 1 つにすぎません。しかし、どうT&& func(...)
ですか?それを行うことで得られる一般的な場所はありますか? クライアントコードだけと比べて、ライブラリや API コードを書くときはおそらく違いますか?