考慮する: - 一つは実際移動shared_ptr
、および他だけコピーshared_ptr
にstd::move
を使用する上記のコードで私はstd :: move_ptrを移動コンストラクタで移動する必要がありますか?
#include <cstdlib>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
class Gizmo
{
public:
Gizmo() : foo_(shared_ptr<string>(new string("bar"))) {};
Gizmo(Gizmo&& rhs); // Implemented Below
private:
shared_ptr<string> foo_;
};
/*
// doesn't use std::move
Gizmo::Gizmo(Gizmo&& rhs)
: foo_(rhs.foo_)
{
}
*/
// Does use std::move
Gizmo::Gizmo(Gizmo&& rhs)
: foo_(std::move(rhs.foo_))
{
}
int main()
{
typedef vector<Gizmo> Gizmos;
Gizmos gizmos;
generate_n(back_inserter(gizmos), 10000, []() -> Gizmo
{
Gizmo ret;
return ret;
});
random_shuffle(gizmos.begin(), gizmos.end());
}
をGizmo::Gizmo(Gizmo&&)
の2つのバージョンがあります。
両方のバージョンが表面上で動作するようです。 1つの違い(私が見ることができる唯一の違い)はmove
バージョンであり、shared_ptr
の参照カウントは一時的に増加しますが、一時的に増加します。
私は通常move
のshared_ptr
に進みますが、私のコードではっきりしていて一貫性があります。私はここで考慮を欠いていますか? テクニカルの理由で、1つのバージョンを他のバージョンよりも優先したいですか?
移動コンストラクタの移動は、少なくとも意味的に一貫しています... – ildjarn
なぜ文字列をshared_ptrに保持しますか?メンバ変数としてのshared_ptrは、しばしば設計不良の兆候です。 –
移動コンストラクタでの移動は、コンパイラが自動的に生成するものと同じです。 –