c++ - compiler - gnuc
Constructores: diferencia entre predeterminar y delegar un parĂ¡metro (1)
La diferencia es que
explicit vector( const Allocator& alloc = Allocator() );
es explicit
incluso en el caso de que se use el argumento predeterminado, mientras que
vector() : vector( Allocator() ) {}
no es. (El explicit
en el primer caso es necesario para evitar que los Allocator
se conviertan implícitamente en un vector
).
Lo que significa que puedes escribir.
std::vector<int> f() { return {}; }
o
std::vector<int> vec = {};
En el segundo caso pero no el primero.
Ver el número 2193 de LWG .
Hoy, me topé con estas declaraciones estándar de constructores de std::vector
// until C++14
explicit vector( const Allocator& alloc = Allocator() );
// since C++14
vector() : vector( Allocator() ) {}
explicit vector( const Allocator& alloc );
Este cambio se puede ver en la mayoría de los contenedores estándar. Un ejemplo ligeramente diferente es 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() );
¿Cuál es la diferencia entre los dos patrones y cuáles son sus (des) ventajas?
¿Son estrictamente equivalentes? ¿El compilador genera algo similar al segundo desde el primero?