Warum sind die ersten beiden Aufrufe an doSomething
OK vom Compiler, aber die Verwendung von zwei Elementen in der Liste verursacht einen mehrdeutigen Aufruf?Warum verursacht die Anzahl der Elemente in einer Initialisierungsliste einen mehrdeutigen Aufruffehler?
#include <vector>
#include <string>
void doSomething(const std::vector<std::string>& data) {}
void doSomething(const std::vector<int>& data) {}
int main(int argc, char *argv[])
{
doSomething({"hello"}); // OK
doSomething({"hello", "stack", "overflow"}); // OK
doSomething({"hello", "stack"}); // C2668 'doSomething': ambiguous call
return 0;
}
Oder 'DoSomething (Std :: Vektor ({" Hallo "," Stack "}));', aber Ihre Lösung ist lesbarer. In jedem Fall, wenn es sich um echten Code handelt, würde ich wahrscheinlich auch einen kleinen Kommentar hinzufügen, um die scheinbar nutzlose Deutlichkeit zu erklären. –
Ich dachte der Konstruktor initialiser_list wird immer aufgerufen, wenn möglich, zum Beispiel in std :: vector {5,1} man bekommt einen Vektor mit Elementen 5 und 1 und nicht 5 mal 1. Warum ist das hier nicht der Fall? –
@ ab.o2c Der Konstruktor der Initialisierungsliste wird bevorzugt, aber wir haben in diesem Fall nicht 'std :: vector {5,1}'. Was wir haben, ist 'std :: vector {const char *, const char *}'. Da die Initialisiererliste den gleichen Typ wie die Elemente des Vektors haben muss, wird sie in diesem Fall ignoriert und der Iteratorkonstruktor wird ausgewählt. –
NathanOliver