libc ++ vs VC ++: Können Konvertierungen ohne UTF mit wstring_convert durchgeführt werden?

8

Die C ++ 11% std::wstring_convert funktioniert super * für die Standard-UTF-8 & lt; - & gt; UTF-16 / UCS2 / UCS4-Konvertierungen. Als ich jedoch versucht habe, eine wstring_convert- oder wbuffer_convert-Instanz mit einer Facette nicht von <codecvt> zu instanziieren, funktionierte sie nicht wie erwartet:

%Vor%

Clang ++ sagt nicht mehr aus und ruft "einen geschützten Destruktor von codecvt & lt; & gt; in ~ wstring_convert"

auf

Visual Studio lässt es zu (obwohl es dieses Gebietsschema nicht gibt, aber das ist eine andere Geschichte), weil sein wstring_convert die Lebenszeitverwaltung des Facettenzeigers an ein Gebietsschemaobjekt bindet, das es als Mitglied hält, und Gebietsschemata wissen, wie man Zeiger löscht alle Facetten.

Ist Visual Studio richtig und libc ++ falsch?

* wie in clang ++ - 2.9 / libc ++ - svn und Visual Studio 2010 EE SP1 implementiert, funktioniert das folgende Beispiel leider auf beiden Seiten, aber nicht in GCC: Ссылка

    
Cubbi 29.09.2011, 15:15
quelle

1 Antwort

10

Ich bin zugegebenermaßen voreingenommen in dieser Antwort. Aber ich werde versuchen, meine Behauptungen mit Verweisen auf N3290 zu bestätigen (das leider nicht mehr öffentlich verfügbar ist). Und ich werde auch eine Lösung anbieten.

Analyse:

Die Synopsis von wstring_convert in [conversions.string] / p2 beinhaltet:

%Vor%

Die "exposition only" bedeutet, dass die wstring_convert diese Mitglieder nicht in dieser Reihenfolge haben müssen. Aber "exposition only" -Mitglieder werden verwendet, um die Auswirkungen verschiedener Mitglieder zu beschreiben, und diese Spezifikationen sind verbindlich.

Und so scheint die Frage zu werden:

  

Was ist die Spezifikation von ~wstring_convert() ?

Dies wird in p17 des gleichen Abschnitts ([conversions.string]) gefunden:

  

~wstring_convert();

     

Effekte: Der Destruktor soll cvtptr löschen.

Das bedeutet für mich, dass ~Codecvt() zugänglich sein muss, und daher folgt libc ++ der C ++ 11 Spezifikation.

Ich stimme auch zu, dass dies ein königlicher Schmerz im Hintern ist.

Lösung:

Die Tatsache, dass alle Facetten von C ++ 98/03 geschützte Destruktoren enthalten, hat sich als sehr unpraktisch herausgestellt. Hier ist ein Adapter, der jede Facette nehmen und ihr einen öffentlichen Destruktor geben kann:

%Vor%

Sie können diesen universellen Adapter jetzt in Ihrem Code verwenden:

%Vor%

Hoffe, das hilft.

    
Howard Hinnant 29.09.2011, 15:50
quelle

Tags und Links