Что означает «default» после объявления функции classа?

Я видел, что default использовался рядом с объявлениями функций в classе. Что оно делает?

 class C { C(const C&) = default; C(C&&) = default; C& operator=(const C&) & = default; C& operator=(C&&) & = default; virtual ~C() { } }; 

Это новая функция C ++ 11 .

Это означает, что вы хотите использовать сгенерированную компилятором версию этой функции, поэтому вам не нужно указывать тело.

Вы также можете использовать = delete чтобы указать, что вы не хотите, чтобы компилятор автоматически сгенерировал эту функцию.

С введением конструкторов перемещения и операторов переадресации правил, когда генерируются автоматические версии конструкторов, деструкторов и операторов присваивания, становится довольно сложным. Использование = default и = delete облегчает работу, так как вам не нужно запоминать правила: вы просто говорите, что хотите.

Это новая функция C ++ 0x, которая сообщает компилятору создать стандартную версию соответствующего конструктора или оператора присваивания, то есть тот, который просто выполняет операцию копирования или перемещения для каждого члена. Это полезно, потому что конструктор перемещения не всегда создается по умолчанию (например, если у вас есть пользовательский деструктор), в отличие от конструктора копирования (а также для назначения), но если нет ничего нетривиального для записи, лучше разрешить компилятор обрабатывает его, а не каждый раз произносить его.

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

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

Подробности см. В Разделе 12.8 стандарта.

Это новое в C ++ 11, см. Здесь . Это может быть очень полезно, если вы определили один конструктор, но хотите использовать значения по умолчанию для остальных. Pre-C ++ 11 вам нужно было бы определить все конструкторы, как только вы их определили, даже если они эквивалентны значениям по умолчанию.

Также обратите внимание, что в определенных ситуациях невозможно предоставить пользовательский конструктор по умолчанию, который ведет себя так же, как компилятор, синтезированный как при инициализации по умолчанию, так и по значению . default позволяет вернуть это поведение.

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

  • Как вы используете конструктор, отличный от стандартного для члена?
  • Значение по умолчанию для типа в Runtime
  • Создание (и доступ) разреженной матрицы с записями NA по умолчанию
  • Каков пакет по умолчанию, в который помещаются мои classы, если я не укажу его?
  • Как изменить каталог данных MySQL?
  • Почему «final» не допускается в методах интерфейса Java 8?
  • Объявление примитивов / объектов, значения инициализации по умолчанию
  • Инициализация нормального массива с одним значением по умолчанию
  • Интерфейс с методами по умолчанию vs Абстрактный class в Java 8
  • Как заполнить / создать экземпляр массива C # с одним значением?
  • Почему компилятор не может вывести тип шаблона из аргументов по умолчанию?
  • Interesting Posts
    Давайте будем гением компьютера.