ultima gnuc compiler compilador c++ std c++14

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?