Рассмотрим следующий код:
#include <initializer_list>
class C {
public:
C() = delete;
C(int) {}
};
class D {
public:
D(std::initializer_list<C> il) {}
};
int main()
{
std::initializer_list<C> il{}; // fine: empty list, no need to construct C
D d2(il); // fine: calls initializer_list ctor with empty list
D d3{il}; // ditto
D d4({}); // still fine
D d5{{}}; // error: use of deleted function 'C::C()'
// WHY is the constructor of 'C' required here?
}
Я думал, что D d5{{}};
вызовет initializer_list
конструктор D
с пустым списком. И, поскольку список пуст, конструктор C
не будет вызван. Тем не менее, он не компилируется:
ошибка: использование удаленной функции 'C::C()'
- D d5{{}};
В чем причина этой ошибки?
Обновление
Проблема на странице 55 в «Эффективном современном C ++» Скотта Мейера заставила меня подумать, что наличие пустых скобок в фигурной инициализации вызовет конструктор initializer_list
с пустым списком. Это не правильно. Подробнее см. в этом блоге от автора.