C ++ 11 implizit konvertieren

8
%Vor%

Ich benutze VS 2013.

Fragen:

  1. Warum führen die Definitionen von str1 und str2 zu unterschiedlichen Kompilierungsfehlern?

  2. 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 ?

Leonhart Squall 16.06.2014, 10:52
quelle

1 Antwort

8

Die erste Definition, std::string str1(myStr); , ist in der Tat nicht eindeutig:

%Vor%

, 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:

%Vor%

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)

%Vor%

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:

%Vor%

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.

    
dyp 16.06.2014, 12:08
quelle

Tags und Links