Forcing std :: vector overload statt int overload auf der Liste mit einem Element

Betrachten Sie den folgenden Code:

#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
}

Live on Coliru

Ich war ein bisschen überrascht zu bemerken, dass in diesem Fall die int-Überladung erfasst wird, d. H. Die Ausgabe des Programms ist:

void f (int)

mit der Warnung

warning: Klammern um den Skalarinitialisierer [-Wbraced-scalar-init] f ({42});

Natürlich passiert das nur, wenn ich eine 1-Element-Liste als Argument übergebe, ansonsten dasstd::vector Überlast wird aufgenommen.

Warum ist{42} wie ein Skalar behandelt und nicht wie eine Init-Liste? Gibt es eine Möglichkeit, den Compiler zu zwingen, das @ auszuwählestd::vector Überladung (ohne explizit @ zu konstruierstd::vector<int>{42}) auch auf 1-Element-Listen?

PS: Dasstd::vector hat einen Init-List-Konstruktor

vector(std::initializer_list<T> init, const Allocator& alloc = Allocator());

see (7) von cppreference.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage