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