2014-09-05 9 views
18

Oggi, sono incappato in these standard declarations di std::vector costruttori:Costruttori: differenza tra inadempiente e delegando un parametro

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

Questo cambiamento può essere visto nella maggior parte dei contenitori standard. Un exemple leggermente diverso è 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()); 

Qual è la differenza tra i due modelli e quali sono i loro vantaggi (dis)?
Sono strettamente equivalenti - il compilatore genera qualcosa di simile al secondo dal primo?

+1

Si dice contenitori "STL". Intendi la firma di queste funzioni standard dei membri del contenitore di librerie come richiesto dallo standard stesso o dal codice di alcune specifiche implementazioni? –

+0

@LightnessRacesinOrbit intendo il primo: presumo che le firme di queste funzioni siano standard (en.cppreference.com dice che c'è un cambiamento proveniente dallo standard - "dal C++ 14"). – Nelfeal

+0

@LightnessRacesinOrbit Non capisco davvero cosa modificare; "STL" è sbagliato? Per me, è la parte della libreria standard che utilizza i modelli (quindi la libreria standard "modello"). O è qualcos'altro? – Nelfeal

risposta

18

La differenza è che

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

è explicit anche per il caso in cui viene utilizzato l'argomento di default, mentre

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

non è. (Il explicit nel primo caso è necessario per evitare che Allocator s di essere implicitamente convertibile in un vector.)

Il che significa che è possibile scrivere

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

o

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

nella seconda caso ma non il primo.

Vedere LWG issue 2193.

+0

Se la parola chiave esplicita viene eliminata, suppongo che un Allocatore possa essere convertito implicitamente in un vettore? – Nelfeal

+0

@Nelxiost corretto, che non vogliamo neanche. –

+3

Ooh questo è molto più interessante di quanto mi aspettassi leggendo la domanda. –