問題タブ [boost-move]

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 投票する
2 に答える
480 参照

c++ - C++03 で std::string を boost::thread に移動する

C++ 11 を使用せずに、複数のプラットフォームとコンパイラでブースト 1.51 を使用しています。

私のメインスレッドには、std::string veryLongString処理のために新しいスレッドに渡す必要がある非常に長く、コピーにコストがかかる があります。
新しいスレッドが作成された後、メイン スレッドを使用する必要がなくなったので、それをctor に移動veryLongStringしたいと思います。 メイン スレッド、または のスコープは、新しいスレッドが完了する前に終了する可能性があるため、参照渡し (たとえば、 を使用) はオプションではありません。boost::thread
veryLongStringboost::ref

明らかに、veryLongStringとして作成された場合、 をスレッド ctor にshared_ptr<std::string>コピーできますが、そうではなかったので、とにかくコピーする必要があります。shared_ptr

[boost::]move() veryLongStringctor にアクセスするにはどうすればよいですかboost::thread(おそらく via を使用boost::bind)。これは可能ですか?

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

c++ - C++ 03で、おそらくboost::moveを使用して、ファクトリ関数から返されたboost::interprocess::unique_ptrをどのように割り当てる必要がありますか

boost::interprocess::unique_ptr を返すファクトリ関数を作成しようとしています。次に例を示します。

問題は、gcc が上記のコードをコンパイルできないことです:

私が変わるとき

それからgccは言う:

私は何か間違ったことをしていますか?

興味深いことに、私がするとき:

コードは問題なくコンパイルされます。

ところで: 私は gcc v4.4.3 と Boost v1.51.0 を使用しています。


アップデート:

次のスニペットを使用して、この問題を解決できました。

operator=上記のキャストは、元の質問で言及されたあいまいなオーバーロードの最初のバージョンに基づいています。2 番目のもの ( operator=(int boost::interprocess::unique_ptr<T, D>::nat::*) は、おそらく、エミュレートするために実装によって提供されます。std::unique_ptr::operator=(nullptr_t)実際には、unique_ptr. 結局のところ、それはoperator=あいまいにもなります。

残念ながら、上記static_cast<>()を使用すると、工場の使用が複雑になりすぎます。

この問題を解決する 1 つの方法はoperator=、常に明示的に を呼び出すことができるため、の 2 番目のオーバーロードを削除することunique_ptr::reset()です。

boost::move()それでも、この問題を解決できるかどうか、またどのように役立つかは疑問です。

0 投票する
0 に答える
253 参照

c++ - unique_ptr 実装の C++03 転送回避策

Boost.Move/other Boost ライブラリの助けを借りて転送セマンティクスを必要とする C++03 プロジェクトに取り組んでいます。プロジェクトの目標は、unique_ptr を C++11 に前方互換性のある方法で提供することです。

C++11 標準では、次のコンストラクターが必要です。

格納されたデータを u から転送し (基本的には ptr_val = u.release())、次のようになります。

  • E が参照型の場合、u のデリータを *this にコピーします。
  • それ以外の場合は、u の削除子を *this に移動します。

テストでは、このコードは「機能する」ようです。

これでカバーできない重要なケースはありますか?

0 投票する
1 に答える
1261 参照

c++ - boost::move() の戻り値を非 const 参照に割り当てると、C++0x モードでは失敗するのに、C++03 モードでは機能するのはなぜですか?

問題の再現に使用できるソース コードは次のとおりです。

GCC で C++03 モードを使用すると、コードは問題なくコンパイルされます。一方、C++0x モードを使用すると、次のエラーが発生します。

そのような失敗の理由は何ですか?C++11 モードで回避する方法はありますか?

上記のコードは、私が一般的なコードで使用するものを簡略化したものです。したがって、そのような組み合わせ ( boost::move+ 戻り値の型としての非 const ref) が必要です。

gcc v4.6.3、Boost 1.54.0、および Ubuntu 12.04 (i386) を使用しています。

更新 1: テスト ケースをもう少し現実的なものにしました。目標は、ロックの下でファンクターを呼び出し、boost::move() を介してファンクターによって返された値を返すジェネリック関数を持つことです。の私の呼び出しのcall_under_lock())。

clang 3.5.1~(exp)更新 2: C++11 モードで使用すると、同様の問題が発生することが判明しました。

更新 3: このトピックは、boost-users メーリング リスト [1] でも議論されています。

[1] http://boost.2283326.n4.nabble.com/move-differences-between-results-in-C-03-and-C-11-modes-td4659264.html