Инициализация с пустыми фигурными скобками

Первая попытка и все отлично работает

class Base {
 public:
    Base() {std::cout << "default ctor!\n"; }
};
...
Base b{};
Base b_one = {};

Еще один способ реализации (добавить explicit):

class Base {
 public:
    explicit Base() {std::cout << "default ctor!\n"; }
};
...
Base b{};
Base b_one = {};  // error! Why?

Я прочитал на cppreference, что в обоих случаях будет использоваться инициализация по умолчанию и никаких различий.

Из инициализации списка:

В противном случае, если braced-init-list пуст и T является типом класса с конструктором по умолчанию, выполняется инициализация значения.

От инициализации значения:

если T является типом класса без конструктора по умолчанию или с предоставленным пользователем или удаленным конструктором по умолчанию, объект инициализируется по умолчанию;

1 ответ

Решение

Я прочитал на cppreference, что в обоих случаях будет использоваться инициализация по умолчанию и никаких различий.

Нет, они не одинаковы. Точнее, Base b{}; прямая инициализация списка, в то время как Base b_one = {}; это инициализация копии списка; для инициализации копирования списка, только неexplicit конструктор может быть вызван.

(акцент мой)

  • прямая инициализация списка (рассматриваются как явные, так и не явные конструкторы)

  • copy-list-initialization (рассматриваются как явные, так и не явные конструкторы, но могут вызываться только неявные конструкторы)

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