Code: Select all
static_assert(std::same_as); // compiles
Der zweite Operand ist Pries von Klassentyp, und es gibt keine Basis- und abgeleitete Typen, so > (Noch kein Ergebnistyp) sollte std :: string sein. Ich weiß, dass in dieser Klausel: < /p>
...LVALUE-TO-RVALUE, Array-to-Pointer- und Funktions-zu-Zeiger-Standardkonvertierungen. < /p>
Aber aus diesem Grund ist diese Erklärung falsch, aber wenn wir annehmen, dass std :: string {} Operand uns den Zieltyp const char*[/code]) und dann benutzerdefinierter Konvertierkonstruktor von std :: string , das const char*. .cond#5, was nicht zufrieden ist, weil wir beide Prvalues von Std :: String haben, also wird expr.cond#6 verwendet und der Rest davon haben wir haben unseren Ergebnistyp von std :: Zeichenfolge . Genau, weil der zweite Operand prvalue und lvalue-to-relevante Konvertierung nicht gelten konnten. Und dieser Expr.cond#5 auch nicht. Also sind wir mit expr.cond#6 abgereist, aber es heißt: < /p>
..Overload -Auflösung wird verwendet, um die zu angewendeten Conversions (falls vorhanden) zu bestimmen an die Operanden ([Over.Match.oper], [Over.built]). ... < /p>
< /blockquote>
Diese Over.match.oper und Over.built, soweit ich das beurteilen kann, nur über überlastete Operatoren (spielt keine Rolle in Dieses Problem) und Conversion-Funktionen (die std :: string keine integrierten Typen enthält. Und im Allgemeinen habe ich das Gefühl, dass diese ganze Klausel nur über die Konvertierung von Klassentypen in integrierte Typen umgewandelt wird, sodass keine Konvertierkonstruktoren. < /P>
wiederum diese Erklärung falsch macht. Wenn wir jedoch davon ausgehen, dass in expr.cond#6 konvertierende Konstruktoren aufgerufen werden könnten (wie die std :: string ), ist das Ergebnis prValue von std :: string .
< Br /> Anmerkung Nr. 1: < /strong> Version des Entwurfs, die ich in dieser Klausel expr.cond #7 verlinkte, erwähnt nur: < /p>
Array-zu-Punkte- und Funktions-zu-Punkte Auch "lvalue-to-Relevalue" -Erkehrung. Ich bin gespannt, warum eine solche Veränderung vorgenommen wurde, obwohl so etwas wie dieser Operator int & () in expr.cond#6 einen der Operanden lvalue machen könnte. Könnte bei dem Problem helfen. Erwähnen Sie in diesem Schritt Expr.cond#6 nichts über benutzerdefinierte Conversions. Und diese Konvertierungen hier wahrscheinlich auch subtil. Vielleicht wird es helfen, über ein Beispiel zu denken.