необязательный конструктор с initializer_list

Какова цель этого специального конструктора, принимающего список инициализатора. Может кто-нибудь привести пример того, когда это будет полезно?

template <class U, class... Args>
constexpr explicit optional(in_place_t, initializer_list<U> il, Args&&... args);

Чем вышеизложенное отличается от этого?

template <class... Args> constexpr explicit optional(in_place_t, Args&&... args);

Ref: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3793.html#optional.object.ctor

Постскриптум Не уверен, использовать ли тег c ++ 14 или c ++ 1z. Я думаю, что должен быть тег для технической спецификации C ++

12

Решение

Причина двух отдельных конструкторов состоит в том, чтобы позволить строительство объектов, которые принимают initializer_list в качестве аргумента конструктора (необязательно сопровождается произвольным списком аргументов). Скажем, у вас есть тип foo это выглядит так:

struct foo
{
foo(std::initializer_list<int>) {}
};

При отсутствии конструктора

template <class U, class... Args>
constexpr explicit optional(in_place_t, initializer_list<U> il, Args&&... args);

вы не сможете построить optional как

optional<foo> o(in_place, {1, 2, 3});

Выше не получается, потому что приготовился-INIT-лист не имеет типа, поэтому вывод аргумента шаблона завершается неудачно. Вы должны будете прибегнуть к чему-то вроде этого:

auto il = {1, 2, 3};
optional<foo> o(in_place, il);

Наличие конструктора, который принимает initializer_list аргумент допускает более естественный синтаксис при построении optional объект.

Вот минимальный пример демонстрируя полезность двух конструкторов.

10

Другие решения