Есть некоторые функции, которые компилятор может неявно определить для нас в случае необходимости и если они могут быть правильно определены для этого класса. подобно
Итак, принимает ли компилятор / конструктор копирования, сгенерированный компилятором, аргумент как const-reference
ИЛИ ЖЕ non-const-reference
,
class Test
{
public:
Test(const Test&); << _1
Test(Test&); << _2
};
Если это произойдет, то каковы руководящие факторы для этого решения.
Правила в ссылка на сайт Прадхан, предоставленный в комментариях, можно интуитивно понять следующим образом: компилятор пытаться определить конструктор копирования с аргументом const T&
если возможно; если нет то будет пытаться определить конструктор копирования с аргументом T&
; и если это невозможно, то конструктор копирования будет определен как удаленный.
Когда объект типа класса T
копируется, его базовые классы и нестатические члены-данные тоже должны быть скопированы. Так что, если один из них, скажем, U
имеет конструктор копирования, который принимает U&
вместо const U&
то нет, если T
конструктор берет const T&
поскольку все подобъекты также будут квалифицированы как cv, и вы не сможете получить U&
, Следовательно, компилятор должен отказаться от создания конструктора копирования, который принимает const T&
и идет с T&
вместо. И аналогично, если какой-то базовый класс или нестатический член данных не может скопировать, то имеет смысл для компилятора сгенерировать конструктор удаленной копии для T
,
Для операторов присваивания копий правила в основном те же, за исключением того, что компилятор ищет операторы присваивания копий базовых классов и нестатических элементов данных (а не их конструкторы копий), а операторам присваивания копий разрешено принимать свои аргументы по значению (в отличие от конструкторов копирования).