2014-09-05 14 views
18

Dzisiaj natknąłem się these standard declarations z std::vector konstruktorów:Konstruktorzy: różnica między zalegających i przekazując parametr

// until C++14 
explicit vector(const Allocator& alloc = Allocator()); 
// since C++14 
vector() : vector(Allocator()) {} 
explicit vector(const Allocator& alloc); 

Ta zmiana może być postrzegane w większości standardowych pojemnikach. Nieco inny exemple jest std::set:

// until C++14 
explicit set(const Compare& comp = Compare(), 
       const Allocator& alloc = Allocator()); 
// since C++14 
set() : set(Compare()) {} 
explicit set(const Compare& comp, 
       const Allocator& alloc = Allocator()); 

Jaka jest różnica między tymi dwoma wzorami i jakie są ich zalety (dis)?
Czy są one ściśle równoważne - czy kompilator generuje coś podobnego do drugiego z pierwszego?

+1

Mówisz pojemniki "STL". Masz na myśli sygnaturę tych standardowych funkcji członka kontenera bibliotecznego, zgodnie z mandatem samego standardu lub kodu konkretnej implementacji? –

+0

@LightnessRacesinOrbit Mam na myśli pierwsze: zakładam, że podpisy tych funkcji są standardowe (en.cppreference.com mówi, że jest zmiana pochodząca ze standardu - "od C++ 14"). – Nelfeal

+0

@LightnessRacesinOrbit Nie bardzo rozumiem, co edytować; czy "STL" jest złe? Dla mnie jest to część standardowej biblioteki, która używa szablonów (stąd standardowa biblioteka "szablonów"). A może to coś innego? – Nelfeal

Odpowiedz

18

Różnica polega na tym, że

explicit vector(const Allocator& alloc = Allocator()); 

jest explicit nawet w przypadku, gdy używany jest domyślny argument podczas

vector() : vector(Allocator()) {} 

nie jest. (The explicit w pierwszym przypadku jest to konieczne, aby zapobiec Allocator s od bycia niejawnie przekształcić w vector.)

Co oznacza, że ​​można napisać

std::vector<int> f() { return {}; } 

lub

std::vector<int> vec = {}; 

w sekundę sprawa, ale nie pierwsza.

Zobacz LWG issue 2193.

+0

Jeśli jawne słowo kluczowe zostanie usunięte, zakładam, że alokator mógł zostać niejawnie przekonwertowany na wektor? – Nelfeal

+0

@Nelxiost poprawny, którego też nie chcemy. –

+3

Ooo, to jest o wiele bardziej interesujące, niż się spodziewałem czytając pytanie. –

Powiązane problemy