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