48 votes

Est-il possible d’émuler Nullptr dans gcc?

J'ai constaté que nullptr avait été implémenté dans Visual Studio 2010. J'aime le concept et je souhaite commencer à l'utiliser dès que possible. Cependant, GCC ne le supporte pas encore. Mon code doit fonctionner sur les deux (mais ne doit pas être compilé avec d'autres compilateurs).

Y a-t-il un moyen de "l'imiter"? Quelque chose comme:

 #define nullptr NULL
 

(Cela ne fonctionnerait évidemment pas du tout, c'est juste pour montrer ce que je veux dire.)

62voto

N 1.1 Points 7687

La proposition officielle a une solution de contournement -

 const                        // this is a const object...
class {
public:
  template<class T>          // convertible to any type
    operator T*() const      // of null non-member
    { return 0; }            // pointer...
  template<class C, class T> // or any type of null
    operator T C::*() const  // member pointer...
    { return 0; }
private:
  void operator&() const;    // whose address can't be taken
} nullptr = {};              // and whose name is nullptr
 

9voto

Roman A. Taycher Points 1898

Il semble que gcc supporte nullptr à partir de la version 4.6 .

6voto

emsr Points 4616

En outre, gcc (en réalité g ++) a une extension __null depuis des années. Cela a été considéré comme une expérience de mise en œuvre de l'industrie lorsque la proposition nullptr a été publiée.

L'extension __null peut détecter des cas particuliers et en avertir, tels que le passage accidentel de NULL à un paramètre bool, alors qu'il était destiné à être passé à un paramètre de pointeur (modifications apportées à une fonction, oubli d'adapter le côté de l'appel).

Bien sûr, ce n'est pas portable. La solution de modèle ci-dessus est portable.

5voto

kfmfe04 Points 5372

Il semble par gcc 4.6.1 (Ubuntu 11.11 oneiric), nullptr a été ajouté.

Une recherche et un remplacement sed rapides et récursifs sur mes fichiers hpp / cpp ont bien fonctionné pour moi:

 find . -name "*.[hc]pp" | xargs sed -i 's/NULL/nullptr/g'
 

2voto

zhaorufei Points 626

Il est très probable que vous avez oublié -std=c++0x . Ma version de Mingw gcc est 4.6.1/4.7.1, à la fois soutien nullptr.

Selon la description dans "La norme c++ de la bibliothèque, un tutoriel et de référence, 2e", nullptr est un mot-clé, peut convertir automatiquement à chaque type de pointeur mais pas de type entier, ce surmonter l'inconvénient d'être NULLE, ce qui est ambigu, à la suite de la surcharge de fonction: void f(int ); void f(void *);

f(NULL); // Ambiguës f(nullptr); // OK

Tester cette fonctionnalité dans VC2010 montre que le document MSDN conflits avec le compilateur, le document dit:

Le nullptr mot clé n'est pas un type et n'est pas pris en charge pour une utilisation avec:

sizeof

typeid

jeter nullptr

En fait dans VC2010, tous les ci-dessus opérateur/expression juridique. sizeof(nullptr) résultat 4. typeid.nom du (des) résultat std::nullptr_t, et de le jeter nullptr peut être pris par "const void *" et "void *"(et les autres types de pointeur).

Alors que gcc(4.7.1) ressemble de plus en plus rigide sur nullptr, jeter nullptr ne peut pas être pris par "void *", peut être pris par '...'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X