Ich benutze VS 2013.
Fragen:
Warum führen die Definitionen von str1
und str2
zu unterschiedlichen Kompilierungsfehlern?
Wie ich weiß, wenn rStr
erstellt wird, wird zunächst ein temporäres String-Objekt erstellt, dann verweist rStr
auf das temporäre Objekt. Warum führt die Erstellung des temporären Objekts jedoch nicht zu einem Kompilierungsfehler? Gibt es Unterschiede zwischen tmp
und strN
?
Die erste Definition, std::string str1(myStr);
, ist in der Tat nicht eindeutig:
, so dass diese Initialisierung aufgrund einer Mehrdeutigkeit fehlschlägt.
Dies ist im Wesentlichen das gleiche Szenario wie
%Vor%Genau eine benutzerdefinierte Konvertierung ist erforderlich, dann wird eine Funktion aufgerufen (für die erste Definition ist die Funktion ein Konstruktor). Beide Conversions sind praktikabel, und keine ist eine Untergruppe der anderen, also haben beide den gleichen Rang.
Die zweite Definition, std::string str2 = myStr;
, ist eigentlich fein . Es ist nur eine benutzerdefinierte Konvertierung in std::string
zulässig, entweder über einen Konstruktor oder über eine Konvertierungsfunktion, nicht beides. Also nur std::string str2 = myStr.operator std::string();
ist lebensfähig.
Hinweis string str2 = expr;
wenn expr
nicht vom Typ string
ist, muss die expr
in < std::string
konvertiert werden. Das resultierende temporäre Objekt wird dann verwendet, um str2
über eine Kopie / Verschiebung zu initialisieren:
Daher muss die Konvertierung auf der rechten Seite direkt in std::string
konvertiert werden, andernfalls würden Sie eine Kette von zwei benutzerdefinierten Konvertierungen benötigen, um das temporäre zu initialisieren: (UDC = User-Defined Konvertierung)
Zum Beispiel erfordert expr
bis char const*
über die operator char*
und dann eine std::string
über den konvertierenden Konstruktor eine Kette von zwei benutzerdefinierten Konvertierungen = & gt; nicht lebensfähig. Wenn wir versuchen, die operator char*()
-Konvertierung zu verwenden, benötigen wir einen zusätzlichen Konstruktoraufruf impliziter -Konstruktor, um die RHS zu einem string
zu machen.
Dies unterscheidet sich von string str1( expr )
, wobei expr
nicht implizit in string
konvertiert werden muss. Es kann konvertiert werden, um einen Parameter eines Zeichenfolgenkonstruktors zu initialisieren. Die direkte Initialisierung von str1
aus dem möglicherweise konvertierten expr
ist keine (n implizite) Konvertierung selbst, sondern nur ein Funktionsaufruf. Es wird kein zusätzliches temporäres erstellt:
Diese zweite Definition wird abgelehnt, wenn mit aktivierter Spracherweiterung kompiliert wird. Ohne Spracherweiterungen ist diese Initialisierung in VS2013 Update 2 in Ordnung.
Der dritte folgt einem anderen Initialisierungsschema. Es sollte sich in diesem Fall wie der zweite verhalten, soweit ich das beurteilen kann. Die Spracherweiterungen scheinen nur für den zweiten, nicht aber für den dritten zu gelten.
Tags und Links c++ c++11 implicit-conversion