次のコードでstd :: moveが何か良いことをするのか、それとも完全に間違っているのかわかりません。 クラスObject
には、移動コンストラクタとコピーコンストラクタの両方が定義されています。std :: moveは有効性のためにreturn文で使用する必要がありますか?
まず:移動付:
template<typename T> template <typename F>
const Object<T> Object<T>::operator*(const F& rhs) const
{
return std::move(Object(*this) *= rhs); // We end in move constructor
}
第二:移動なし:
template<typename T> template <typename F>
const Object<T> Object<T>::operator*(const F& rhs) const
{
return Object(*this) *= rhs; // We end in copy constructor
}
*=
オペレータは次のように定義される:ここでは
template<typename T> template<typename F>
Object<T>& Object<T>::operator*=(const F& rhs)
{
for(int i = 0; i < dimension ; i++)
{
_inner[i] *= rhs;
}
return *this;
}
は共同ですドは、私はそれをテストするために使用します。
Object<double> test(4);
Object<double> test2(test * 4);
std::cout << test2; // works fine
結果、我々は移動コンストラクタで終わる最初場合と二で 我々はコピーコンストラクタで終わります。
いずれの場合も、コードがコンパイルされます。
新しいオブジェクトをコピーするのではなく移動するほうが速いと思うので、もう1つ効率的ですか?
追加情報: 私は次のコンパイラを使用します。私はそれがあると仮定しますので、G ++(Ubuntuの/リナロ4.7.3-1ubuntu1)4.7.3
'const'値を返さず、' std :: move'ローカル変数/一時変数を明示的に指定しないで、(N)RVOを禁止します。あなたの '演算子*'を 'Object tmp(* this);と書くのはなぜでしょうか。 tmp * = rhs; return tmp; '?こうすることで、コンパイラはローカル変数を返すことを確認し、それを 'return'すると自動的にrvalueに変換します。 – Xeo
を見てください:http://stackoverflow.com/questions/4986673/c11-rvalues-and-move-semantics-confusion – Steve
私は 'const'なしでテストしましたが、状況は変わりませんが、私は理解できました'std :: move'が必要な答えから' lvalue'を返します。一方、それが 'rvalue'だった場合、' std :: move'は必要ありませんでした。最後に、一時変数を使用すると、自動的に移動されますか? – CodeTower