Seit GCC 6 in C ++ sieht die Deklaration / Definition einer unique_ptr<T[]>::reset
-Methode (nicht diejenige, die nur nullptr_t
akzeptiert) folgendermaßen aus:
Dies wurde irgendwann geändert, um zu implementieren N4089 . Nach diesem Dokument:
Diese Funktion verhält sich genauso wie das reset-Element des primären Templates, außer dass es dies tut beteiligt sich nicht an der Überladungsauflösung, es sei denn, beides
-
U
ist der gleiche Typ wiepointer
oder-
pointer
ist derselbe Typ wieelement_type*
,U
ist ein ZeigertypV*
undV(*)[]
ist inelement_type(*)[]
konvertierbar.
Betrachten wir das folgende Beispiel:
%Vor% Seit GCC Version 6 gibt es einen Fehler und beschwert sich, dass er std::swap
nicht mit const char*&
und char*&
aufrufen kann.
reset
Methode findet in der Überladungsauflösung statt, da char[]
in const char[]
konvertierbar ist, aber natürlich erwartet std::swap
zwei Referenzen desselben Typs.
Wird dies als richtiges Verhalten angesehen? Wenn ja, warum? Wenn ich char[]
implizit in const char[]
umwandeln kann, warum sollte das nicht mit unique_ptr
möglich sein?
Das scheint wirklich ein Fehler in gcc libstdc ++ zu sein. @Barry hat es gemeldet: 77987
Tags und Links c++ gcc c++11 unique-ptr gcc6