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
}

Vive en Coliru

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.

Respuestas a la pregunta(2)

Su respuesta a la pregunta