C ++ Verkettung; string + double; Operator + vs Operator + =
gcc v10.2.0, -std = c ++ 11
Ich versuche nicht, den doppelten Wert mit 'std :: to_string ()' in eine Literalzeichenfolge umzuwandeln. Der Versuch, einen ähnlichen Effekt beim Hinzufügen einer Ganzzahl zu einer Zeichenfolge zu erzielen, jedoch mit einem doppelten Wert.
Erwartete Ausgabe: "abcdA"
string s { "abcd" };
double d { 65.1 };
// s = s + d; // Error. no match for ‘operator+’ (operand types are ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’} and ‘double’)
s += d;
Sowohl die Methoden 'operator +' als auch 'operator + =' der Klasse 'string' haben eine Version, die ein Argument 'char' akzeptiert, aber nur die Methode 'operator + =' scheint einen implizit konvertierten Wert zu erhalten und erzeugt keinen Fehler.
Warum entscheidet sich der Compiler dafür, einen konvertierten Wert übereinander zu übergeben?
Antworten
operator +=ist eine Mitgliedsfunktion und keine Vorlage für sich. Für eine bestimmte stringInstanz lautet das RHS-Argument also char. Der Compiler sucht nach einer Konvertierung in diesen Typ.
operator +ist eine kostenlose Funktionsvorlage, die so gestaltet ist, dass sie mit jeder basic_stringInstanziierung funktioniert :
template<class CharT, class Traits, class Alloc>
std::basic_string<CharT,Traits,Alloc>
operator+( const std::basic_string<CharT,Traits,Alloc>& lhs,
CharT rhs );
Beachten Sie, dass dies CharTsowohl im basic_stringArgument als auch als RHS verwendet wird. Dies bedeutet, dass der Compiler versucht, es aus beiden Argumenten abzuleiten, und zu einem konsistenten Ergebnis gelangen muss. Aber in Ihrer Hinzufügung ist die linke Seite ein string, macht CharTein char, aber die rechte Seite ist ein double, macht CharTein double. Diese Inkonsistenz ist der Grund, warum der Compiler keinen Typ für auswählen kann CharTund somit die Überladung vollständig beseitigt. Wenn dann alle vielen Überladungen von durchgesehen sind operator +, gibt es auf und sagt, dass es keine passende Funktion gibt.