9

次のコードの std::move が何か良いことをするのか、それとも完全に間違っているのかわかりませんか? このクラスObjectには、Move コンストラクターと Copy コンストラクターの両方が定義されています。

最初: 移動あり:

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
}

2番目: 移動なし:

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

結果最初のケースではムーブ コンストラクターで終了し、2 番目 のケースではコピー コンストラクターで終了します。

どちらの場合でも、コードはコンパイルされます。

新しいオブジェクトをコピーするのではなく移動する方が速いと思うので、一方が他方よりも効率的ですか?

追加情報: 次のコンパイラを使用しています: g++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3

4

1 に答える 1