Как работает std :: initializer_list? - PullRequest
0 голосов
/ 18 июня 2020

Я сейчас изучаю c ++ 11, я не понял конструктор std :: initializer_list, он выглядит так

constexpr initializer_list() noexcept : _First(nullptr), _Last(nullptr) {}

constexpr initializer_list(const _Elem* _First_arg, const _Elem* _Last_arg) noexcept
    : _First(_First_arg), _Last(_Last_arg) {}

Но как это работает с

std::initializer_list<int> v{1,2,3,4,5,6,7,8,9,0};

и i попробовал это

constexpr init(const _Elem* _First_arg, const _Elem* _Last_arg) noexcept
    : _First(_First_arg), _Last(_Last_arg) {}

, но это показывает ошибку

init<int> ob{1,2,3,4,5,6,7,8,9,0}; //this shows error

 note: candidate: 'constexpr init<_Elem>::init(const _Elem*, const _Elem*) [with _Elem = int]'
 constexpr init(const _Elem* _First_arg, const _Elem* _Last_arg) noexcept
           ^~~~
 note:   candidate expects 2 arguments, 10 provided

, и я изменил {} на (), например

std::initializer_list<int> v(1,2,3,4,5,6,7,8,9,0);

Это показывает ошибку.

1) Как работает std :: initializer_list?

2) Что стоит за {}?

Спасибо.

1 Ответ

8 голосов
/ 18 июня 2020

std::initializer_list особенный. Невозможно написать класс, который можно было бы использовать в качестве аргумента конструктора таким же образом. Правила языка определяют, как работает std::initializer_list - или, скорее, как работают конструкторы, которые принимают std::initializer_list, т.е. конструкторы списка инициализаторов . И языковая реализация заставляет его работать, как указано.

Идентификаторы PS, такие как _Elem, зарезервированы для языковой реализации. Поскольку ваш класс init не является частью реализации языка, использование зарезервированных идентификаторов приводит к неопределенному поведению. Не используйте зарезервированные идентификаторы.

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