Инициализация с пустыми фигурными скобками
Первая попытка и все отлично работает
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 (рассматриваются как явные, так и не явные конструкторы, но могут вызываться только неявные конструкторы)