C ++ объявить операцию перемещения / копирования будет подавлять генерацию связанных операций?

Я видел предложение в Язык программирования 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

Решение

Я определяю назначение перемещения, должно быть не назначенное по умолчанию назначение копии, сгенерированное как сказано в книге

Правильный.

но как мог а3 получить копию а1?

Это не могло в соответствии со стандартом. Если компилятор не дает вам диагностическое сообщение для этого, то компилятор не соответствует стандарту.


Результат a1+a2 это значение

Правильный.

как можно передать это значение для копирования присваивания, аргумент которого const A&?

Потому что rvalues ​​может быть привязан к lvalue ссылкам на const, Время жизни временного объекта увеличивается, чтобы соответствовать потенциальному времени жизни ссылки. Это для продолжительности функции в случае ссылочного аргумента.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]