В С++ 11, если доступны как копирование, так и перенос, компилятор автоматически выбирает назначение копирования, если аргумент равен lvalue и присваивает переключение, если он является rvalue. Используя std::move
можно явно выбрать назначение перемещения для lvalue. Но как можно явно выбрать назначение копии для rvalue?
Пример кода:
#include <iostream>
class testClass
{
public:
testClass &operator=(const int &other) {
std::cout << "Copy assignment chosen." << std::endl;
return *this;
}
testClass &operator=(int &&other) {
std::cout << "Move assignment chosen." << std::endl;
return *this;
}
};
int main(int argc, char *argv[])
{
int a = 4;
testClass test;
test = a; // Selects copy assignment
test = 3; // Selects move assignment
test = std::move(a); // Selects move assignment
// test = std::copy(3); // <--- This does not work
return 0;
}