2014-12-03 22 views
10

Başlatıcı listesini alarak bu özel kurucunun amacı nedir? Birisi, bunun ne zaman yararlı olacağına dair bir örnek verebilir mi?initializer_list ile isteğe bağlı yapıcı

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

Yukarıdakiler bundan nasıl farklı?

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

Not; C++ 14 veya C++ 1z etiketinin kullanılıp kullanılmayacağından emin değil. Bence C++ teknik şartname için etiket olmalı

+0

'C++ 14', C++ 1y'dir; C++ 1z' ​​C++ 17' – enedil

cevap

8

İki ayrı yapıcının nedenleri, yapıcı argümanı olarak initializer_list alan nesnelerin oluşturulmasına izin vermektir (isteğe bağlı olarak isteğe bağlı argüman listesi izler). Bir optional

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

olarak inşa etmek mümkün olmaz yapıcı

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

yokluğunda

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

: Bir şuna benzer tip foo var ki Yukarıdaki hatalar, destekli başlangıç ​​listesi'un tür içermemesinden dolayı, şablon argüman kesintisi başarısız olur. Böyle bir şeye başvurmak zorunda ediyorum: optional nesneyi oluştururken

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

initializer_list argüman kabul yapıcı olması daha doğal bir sözdizimi sağlar.

Burada iki kurucunun faydasını gösteren bir minimal example gösterilmektedir.

+3

Hmm. Aynı açıklama "vector.emplace_back" için geçerli değil mi? – balki

+5

@balki Kesinlikle, bu yüzden std :: vektörünü yapamazsınız: () .emplace_back ({1,2,3}) 'ancak' std :: vektör () .emplace_back (std :: initializer_list {1,2,3}) 'başarılı. – Praetorian

+0

Teknik sebebi anlıyorum. Ancak, bazı bölümlerde başlatıcı listesi desteği için özel çaba gösterilmiyor, ancak diğerlerinde desteklenmiyor. – balki