Forzar la sobrecarga std :: vector en lugar de la sobrecarga int en la lista con un elemento
Considere el siguiente código:
#include <iostream>
#include <vector>
void f(std::vector<int> v) {std::cout << __PRETTY_FUNCTION__ << std::endl;}
void f(int n) {std::cout << __PRETTY_FUNCTION__ << std::endl;}
int main()
{
f({42}); // the int overload is being picked up
}
Me sorprendió un poco darme cuenta de que en este caso se está recogiendo la sobrecarga int, es decir, la salida del programa es:
nulo f (int)
con la advertencia
advertencia: llaves alrededor del inicializador escalar [-Wbraced-scalar-init] f ({42});
Por supuesto, esto sucede solo cuando paso una lista de 1 elemento como argumento, de lo contrario, elstd::vector
se está recogiendo la sobrecarga.
Por que es{42}
tratado como un escalar y no como una lista de inicio? ¿Hay alguna forma de obligar al compilador a elegir elstd::vector
sobrecarga (sin construir explícitamentestd::vector<int>{42}
) incluso en listas de 1 elemento?
PD: elstd::vector
tiene un constructor de lista de inicio
vector(std::initializer_list<T> init, const Allocator& alloc = Allocator());
ver (7) decppreference.