Создает ли сгенерированный компилятором конструктор / назначение копирования его параметр с помощью 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,

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

Другие вопросы по тегам