3

ブーストの 1.53 ヘッダーの weak_ptr を調べたところ、文書化されていないにもかかわらず、ムーブ代入とムーブ コンストラクターが実装されていることに驚きました。このドキュメントから、移動機能を提供する std::weak_ptr の要件はありません。

Visual Studio 2012 の weak_ptr の実装を見てみると、weak_ptr で宣言されている明らかな移動操作は見当たりませんが、継承の背後に隠されている可能性があります。ただし、このコードの結果、ウォッチ ウィンドウで 1 つの共有参照と 2 つの弱い参照がポインターに報告されるため、weak_ptr が移動可能になっていないと思われます。

std::shared_ptr<int> ptr(std::make_shared<int>(5));
std::weak_ptr<int> weakptr(ptr);
std::weak_ptr<int> movedWeakPtr(std::move(weakptr));

std::weak_ptr が移動機能を提供しない正当な理由はありますか? そうでない場合は、weak_ptr を可動型として扱う必要がありますか?

4

1 に答える 1

6

コピー可能なすべての型は、定義上、移動可能です。weak_ptrコピー可能であり、したがって移動可能です。

weak_ptr 確かに、移動コンストラクターを持つことができます。しかし、それは比較的マイナーな最適化のためだけです。それはおそらく標準化委員会の見落としでした。

于 2013-04-16T04:20:48.353 に答える