問題タブ [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.
c++ - C++03 で std::string を boost::thread に移動する
C++ 11 を使用せずに、複数のプラットフォームとコンパイラでブースト 1.51 を使用しています。
私のメインスレッドには、std::string
veryLongString
処理のために新しいスレッドに渡す必要がある非常に長く、コピーにコストがかかる があります。
新しいスレッドが作成された後、メイン スレッドを使用する必要がなくなったので、それをctor に移動veryLongString
したいと思います。
メイン スレッド、または のスコープは、新しいスレッドが完了する前に終了する可能性があるため、参照渡し (たとえば、 を使用) はオプションではありません。boost::thread
veryLongString
boost::ref
明らかに、veryLongString
として作成された場合、 をスレッド ctor にshared_ptr<std::string>
コピーできますが、そうではなかったので、とにかくコピーする必要があります。shared_ptr
[boost::]move()
veryLongString
ctor にアクセスするにはどうすればよいですかboost::thread
(おそらく via を使用boost::bind
)。これは可能ですか?
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()
それでも、この問題を解決できるかどうか、またどのように役立つかは疑問です。
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 に移動します。
テストでは、このコードは「機能する」ようです。
これでカバーできない重要なケースはありますか?
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] でも議論されています。