Я видел предложение в Язык программирования C ++ с которым меня смущают:
• Если программист объявляет операцию копирования, операцию перемещения или деструктор для класса, для этого класса не создается операция копирования, операция перемещения или деструктор.
Я написал тестовый код, показанный ниже:
#include <iostream>
using namespace std;
class A
{
public:
A() :a(0){}
A(int _a) :a(_a){}
int get() const
{
return a;
}
/*A& operator=(const A &x)
{
a = x.a;
cout << "A copy assignment" << endl;
return *this;
}*/
A& operator=(A&&x)
{
cout << "A move assignment" << endl;
swap(a, x.a);
return *this;
}
private:
int a;
};
A operator+(const A &x, const A &y)
{
A temp{ x.get() + y.get() };
return temp;
}
int main()
{
A a1(1), a2(2), a3;
a3 = a1;
cout << a3.get() << endl;
return 0;
}
Я определяю назначение перемещения, не должно быть назначений копирования по умолчанию, сгенерированных, как сказано в книге, но как a3 может получить копию a1?
Другой вопрос:
Я изменил выражение присваивания a3:
a3 = a1+a2;
Затем я закомментирую назначение перемещения и удаляю комментарий о назначении копирования:
A& operator=(const A &x)
{
a = x.a;
cout << "A copy assignment" << endl;
return *this;
}
/*
A& operator=(A&&x)
{
cout << "A move assignment" << endl;
swap(a, x.a);
return *this;
}*/
как может быть вызвано назначение копирования? Результат a1 + a2 это значение, как это значение может быть передано для копирования назначения, аргумент которого const A&? Прости мое замешательство в отношении ценности
любая помощь приветствуется!
Я определяю назначение перемещения, должно быть не назначенное по умолчанию назначение копии, сгенерированное как сказано в книге
Правильный.
но как мог а3 получить копию а1?
Это не могло в соответствии со стандартом. Если компилятор не дает вам диагностическое сообщение для этого, то компилятор не соответствует стандарту.
Результат
a1+a2
это значение
Правильный.
как можно передать это значение для копирования присваивания, аргумент которого
const A&
?
Потому что rvalues может быть привязан к lvalue ссылкам на const
, Время жизни временного объекта увеличивается, чтобы соответствовать потенциальному времени жизни ссылки. Это для продолжительности функции в случае ссылочного аргумента.
Других решений пока нет …