移動のみのタイプがあり、コピーは禁止されています。何らかのシステムでそれを渡したいのですが、その型のパラメーターを受け取る関数にどの種類の署名を使用すればよいかわかりません。このタイプのオブジェクトはシステムに移動する必要があり、コピーは一切行われません。
例:
#include <vector>
class Foo
{
public:
Foo( std::string name ) : m_name( std::move( name ) ){}
Foo( Foo&& other ) : m_name( std::move( other.m_name ) ){}
Foo& operator=( Foo&& other ){ m_name = std::move( other.m_name ); }
const std::string& name() const { return m_name; }
// ...
private:
Foo( const Foo& ) ;//= delete;
Foo& operator=( const Foo& ) ;//= delete;
// ...
std::string m_name;
};
class Bar
{
public:
void add( Foo foo ) // (1)
// or...
void add( Foo&& foo ) // (2)
{
m_foos.emplace_back( std::move(foo) ); // if add was template I should use std::forward?
}
private:
std::vector<Foo> m_foos;
};
void test()
{
Bar bar;
bar.add( Foo("hello") );
Foo foo("world");
bar.add( std::move(foo) );
}
(オブジェクトを移動していると仮定すると、両方の署名が VS2012 でコンパイルされます)
1 と 2 のどちらの署名を優先する必要がありますか?
どちらも機能しているように見えますが、違いがあるはずだと思います...