Ich arbeite an einer Bibliothek mit zwei verschiedenen Endbenutzern, von denen einer gcc 4.5.3 verwendet und der andere gerade nach gcc 4.6.3 verschoben. Die Bibliothek verwendet die neuen C++ 11-Smartpointer (insbesondere unique_ptr) und kompiliert in gcc 4.5.3. Zwischen diesen beiden Versionen begann gcc jedoch, nullptr zu unterstützen, so dass die API von unique_ptr geändert wurde, um dem Standard besser zu entsprechen. Dabei ging so nun der folgende Code von fein bis mehrdeutigunique_ptr, nullptr und unterstützende gcc 4.5.x und 4.6.x
unique_ptr up(new int(30));
...
if(up == 0) // ambiguous call now to unique_ptr(int) for 0
Gibt es einen sauberen (dh., Nächsten Satz) Weg, um die if-Anweisung oben zu ändern, so dass es sowohl mit als auch ohne nullptr funktioniert? Ich mag eine configure Kontrolle zu vermeiden, und dann einen Makro wie folgt aus (was meiner Meinung nach funktionieren wird), wenn möglich
#if defined NULLPOINTER_AVAILABLE
#define NULLPTR (nullptr)
#else
#define NULLPTR (0)
#endif
oder ist dies der einzige Weg, um das Verhalten zu bekommen ich suche?
Sie haben Recht, dass Ihr Beispiel funktioniert (und meins in der Problembeschreibung für diese Angelegenheit), also muss es etwas mit den Typen zu tun haben, die ich tatsächlich verwende (ich verwende nicht "int", sondern eine Vorlagenklasse). Ich werde sehen, ob ich ein besseres Beispiel finden kann, das verursacht, was ich sehe, und wenn nicht, werde ich das korrekt markieren. – bpw1621
@ bpw1621: Ich bin sicher, dass dies etwas mit dem tatsächlichen Typ zu tun hat. Sind sie * MoveConstructible * und * MoveAssignable *? Sie können dies mit den entsprechenden 'type_traits'-Elementen wie' is_move_constructible' überprüfen. – dirkgently
Wenn sie Typen sind, die die Unklarheit verursachen? Ich habe den Verschiebungskonstruktor im Überladungssatz gesehen, denke ich. – bpw1621