Какова цель этого специального конструктора, принимающего список инициализатора. Может кто-нибудь привести пример того, когда это будет полезно?
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 ++
Причина двух отдельных конструкторов состоит в том, чтобы позволить строительство объектов, которые принимают 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
объект.
Вот минимальный пример демонстрируя полезность двух конструкторов.