Создает ли сгенерированный компилятором конструктор / назначение копирования его параметр с помощью const / volatile

Есть некоторые функции, которые компилятор может неявно определить для нас в случае необходимости и если они могут быть правильно определены для этого класса. подобно

  • конструктор по умолчанию
  • конструктор копирования
  • оператор присваивания
  • деструктор.

Итак, принимает ли компилятор / конструктор копирования, сгенерированный компилятором, аргумент как const-reference ИЛИ ЖЕ non-const-reference,

class Test
{
public:
Test(const Test&);      << _1
Test(Test&);            << _2
};

Если это произойдет, то каковы руководящие факторы для этого решения.

3

Решение

Правила в ссылка на сайт Прадхан, предоставленный в комментариях, можно интуитивно понять следующим образом: компилятор пытаться определить конструктор копирования с аргументом const T& если возможно; если нет то будет пытаться определить конструктор копирования с аргументом T&; и если это невозможно, то конструктор копирования будет определен как удаленный.

Когда объект типа класса T копируется, его базовые классы и нестатические члены-данные тоже должны быть скопированы. Так что, если один из них, скажем, U имеет конструктор копирования, который принимает U& вместо const U&то нет, если Tконструктор берет const T& поскольку все подобъекты также будут квалифицированы как cv, и вы не сможете получить U&, Следовательно, компилятор должен отказаться от создания конструктора копирования, который принимает const T&и идет с T& вместо. И аналогично, если какой-то базовый класс или нестатический член данных не может скопировать, то имеет смысл для компилятора сгенерировать конструктор удаленной копии для T,

Для операторов присваивания копий правила в основном те же, за исключением того, что компилятор ищет операторы присваивания копий базовых классов и нестатических элементов данных (а не их конструкторы копий), а операторам присваивания копий разрешено принимать свои аргументы по значению (в отличие от конструкторов копирования).

1

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


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