Проблема с конструктором std :: initializer_list и "инициализацией в скобках" - PullRequest
0 голосов
/ 07 января 2019

Рассмотрим следующий код:

#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 с пустым списком. Это не правильно. Подробнее см. в этом блоге от автора.

1 Ответ

0 голосов
/ 07 января 2019

D d5{{}}; пытается инициализировать d5 одноэлементным списком инициализатора. Этот один элемент - {}, что является сокращением для C{} - созданный по умолчанию экземпляр C. Но C не имеет конструктора по умолчанию - отсюда и ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...