Цель явных конструкторов по умолчанию

Я недавно заметил класс в C++ 0x, который призывает к явному конструктору по умолчанию. Однако мне не удается придумать сценарий, в котором конструктора по умолчанию можно назвать неявно. Это походит на довольно бессмысленный спецификатор. Я думал, возможно, что это запретит Class c; в пользу Class c = Class(); но это, кажется, не имеет место.

Некоторые соответствующие кавычки от C++ 0x FCD, так как для меня легче переместиться [по подобному тексту, существуют в C++ 03, если не в тех же местах]

12.3.1.3 [class.conv.ctor]

Конструктор по умолчанию может быть явным конструктором; такой конструктор будет использоваться для выполнения инициализации по умолчанию или инициализации значения (8.5).

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

8.5.6 [decl.init]

Для установки по умолчанию - инициализируют объект средств типа T:

— если T (возможно квалифицирован к условной цене) тип класса (Пункт 9), конструктора по умолчанию для T называют (и инициализация плохо формируется, если T не имеет никакого доступного конструктора по умолчанию);

8.5.7 [decl.init]

Для оценки - инициализируют объект средств типа T:

— если T (возможно квалифицирован к условной цене) тип класса (Пункт 9) с обеспеченным пользователями конструктором (12.1), то конструктора по умолчанию для T называют (и инициализация плохо формируется, если T не имеет никакого доступного конструктора по умолчанию);

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

8.5.11 [decl.init]

Если никакой инициализатор не указан для объекта, объект инициализируется значением по умолчанию;

Из того, что я могу сказать, это просто оставляет преобразование ни из каких данных. Который не имеет смысла. Лучшее, которое я могу придумать, было бы следующим:

void function(Class c);
int main() {
  function(); //implicitly convert from no parameter to a single parameter
}

Но очевидно который не является путем, C++ обрабатывает параметры по умолчанию. Что еще там, который сделал бы explicit Class(); ведите себя по-другому по сравнению с Class();?

Определенный пример, который генерировал этот вопрос, был std::function [20.8.14.2 func.wrap.func]. Требуется несколько конструкторов преобразования, ни один из которых не отмечен явный, но конструктор по умолчанию.

36
задан curiousguy 13 June 2018 в 02:08
поделиться

1 ответ

Это объявляет явный конструктор по умолчанию:

struct A {
  explicit A(int a1 = 0);
};

A a = 0; /* not allowed */
A b; /* allowed */
A c(0); /* allowed */

В случае отсутствия параметра, как в следующем примере, явный является избыточный.

struct A {
  /* explicit is redundant. */
  explicit A();
};

В некоторых черновиках C ++ 0x (я полагаю, что это был n3035), это имело следующее значение:

A a = {}; /* error! */
A b{}; /* alright */

void function(A a);
void f() { function({}); /* error! */ }

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

28
ответ дан 27 November 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: