Я не могу понять, делает ли 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
}
Второй: без перемещения:
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
Результат В первом случае мы заканчиваем конструктор перемещения, а в втором случае заканчиваем конструктор копирования.
В любом случае код компилируется.
Является ли один из них более эффективным, чем другой, поскольку я предполагаю, что быстрее переместить новый объект, чем копировать его?
Дополнительная информация: я использую следующий компилятор: g++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
constзначений, не используйте явноstd::moveлокальные/временные переменные, это запрещает (N)RVO. Почему бы не написатьoperator*какObject tmp(*this); tmp *= rhs; return tmp;? Таким образом, компиляторы видят, что вы возвращаете локальную переменную, и автоматически превращают ее в rvalue приreturnинге. - person Xeo   schedule 17.05.2013const, это не меняет ситуацию, но из ответов я понял, что мне нужноstd::move, так как я возвращаюlvalue. Если бы с другой стороны было иrvalueмне не нужно былоstd::move. И, наконец, если бы я использовал временную переменную, она была бы автоматически перемещена? - person CodeTower   schedule 17.05.2013