C ++ Literal String und Const String Referenzargument [doppelt]

8

Ich habe zwei Überladungsfunktionen mit const std :: string & amp; und bool jeweils. Ich rufe jetzt die Funktion mit einer literalen Zeichenfolge auf. Die Bool-Version wird aufgerufen. Das ist ein bisschen seltsam, und es ist wirklich eine Falle.

Kann jemand erklären warum?

Siehe den folgenden Code. Die Ausgabe ist

%Vor% %Vor%     
WeidongLian 23.06.2015, 00:06
quelle

1 Antwort

3

Das Problem ist, dass Ihr Argument zum Schreiben ist nicht ein Wert vom Typ std :: string (es ist kein Literal von std :: string), sondern ein Zeichen-Array.

Leider, und ich stimme Ihnen zu, dass es ein Fallstrick ist, werden die Regeln der Überladungsauflösung die Umwandlung von Array in boolean über die Konvertierung in const Verweis auf String auswählen.

Wohlgemerkt, es gibt in C ++ 11 aktuelle std::string Literale, ich werde hier nicht auf die Details eingehen.

Was die Überladung behebt, ist die explizite Konvertierung in std :: string:

write(std::string("data")) wird das Richtige tun.

Verhindern Sie dieses Problem in der Zukunft. Es ist in der Tat eine Falle.

    
EdMaster 23.06.2015 01:34
quelle

Tags und Links