2011-10-19 18 views
7

To pytanie zostało również przesłane do Usenetu, gdzie jest bardziej odpowiednie, ale jest to większe i bardziej niezawodne forum.Bezpośredni vs jednolita inicjalizacja w std :: allocator

std::allocator::construct określa się do przekazania jej parametrem argumentu opakowania do obiektów budowlanych za pomocą nawiasów a.k.a. bezpośredniego inicjalizację.

Jeśli jest używany aparat ortodontyczny, a.k.a. jednolita inicjalizacja, mogliśmy zainicjować kruszywa typy danych z funkcjami takimi jak std::make_shared i container::emplace. Ponadto byłoby dopuszczalne umieszczenie zawartości listy inicjalizacyjnej na liście argumentów takiej funkcji, , rozwiązującej problem związany z dedukcją typu initializer_list pod przekazywaniem .

Czy ta alternatywa została rozpatrzona i odrzucona? Czy jest już za późno na zmianę w przyszłym standardzie? Wygląda na to, że będzie to przełomowa zmiana, ale nie jest szczególnie haniebna.

+3

Stos Przepełnienie większy niż _Usenet_ ?! : P –

+0

@ Tomalak: Większe niż comp.std.C++ i comp.lang.C++. Moderowane, gdzie przesłałem. I dużo bardziej wredny niż dom wariatów comp.lang.C++, z którym nie zawracałem sobie głowy. – Potatoswatter

+0

Tęskniłeś za moją buźką. –

Odpowiedz

9

Nie wiem, co SC rozważał, ale należy pamiętać, że ujednolicona inicjalizacja nie działa tak naprawdę w ogólnych kontekstach (brak konstrukcji wartości *). Rozważmy tę próbę:

template<typename T, typename... Args> 
T 
make(Args&&... args) 
{ 
    return T { std::forward<Args>(args)... }; 
} 

Otrzymasz:

assert(make<std::vector<int>>(10, 0).size() == 2); 
assert(std::vector<int>(10, 0).size() == 10); 

i to nie skompilować:

make<std::vector<int*>>(10u, 0); 

podczas gdy to robi:

std::vector<int*>(10u, 0); 

Jeśli dana interakcja pomiędzy perfekcyjnym przekazywaniem i listy inicjalizacyjne, które powodują, że to zostało sformalizowane wystarczająco szybko, mogłem zobaczyć, że SC nie chce restartować od zera.

(*): T {} jest w porządku nawet w ogólnych kontekstach.

+0

Bah, konstrukcja "Zrób właściwą rzecz". Jeszcze mnie nie ugryzł. Nadal byłoby miło mieć alternatywę. Standard wymaga, aby 'std :: is_constructible :: value' było' true' dla argumentów 'construct'; bezpośrednia inicjalizacja może być awarią zapewnioną przez implementację pod parasolem UB. – Potatoswatter

+0

@Potatoswatt Ponieważ ta cecha zwróci wartość "true", ponieważ typ jest możliwy do skonstruowania przy użyciu bezpośredniej inicjalizacji, myślę, że masz na myśli to, że awaryjne rozwiązanie jest równoznaczne z inicjalizacją. Ciekawy pomysł, który jest zgodny z obowiązującymi przepisami. –

+0

Tak, oczywiście: vP – Potatoswatter

Powiązane problemy