sirve que para not declared c++ gcc c++11 nullptr

c++ - que - nullptr vs null



¿Se puede emular nullptr en gcc? (5)

Vi que nullptr se implementó en Visual Studio 2010. Me gusta el concepto y quiero comenzar a utilizarlo lo antes posible; sin embargo, GCC aún no lo admite. Mi código necesita ejecutarse en ambos (pero no tiene que compilarse con otros compiladores).

¿Hay alguna manera de "emularlo"? Algo como:

#define nullptr NULL

(Eso obviamente no funcionaría del todo, es solo para mostrar lo que quiero decir).


Además, gcc (en realidad g ++) ha tenido una extensión __null durante años. Esto se contó como experiencia de implementación de la industria cuando salió la propuesta nullptr.

La extensión __null puede detectar casos especiales y advertir sobre ellos, como pasar accidentalmente NULL a un parámetro bool, cuando estaba destinado a pasar a un parámetro de puntero (los cambios realizados en una función, olvidaron adaptar el lado de la llamada).

Por supuesto, esto no es portátil. La solución de plantilla anterior es portátil.


Es muy probable que hayas olvidado -std = c ++ 0x. Mi versión Mingw de gcc es 4.6.1 / 4.7.1, ambos soportan nullptr bien.

Según la descripción en "La biblioteca estándar de C ++, un tutorial y referencia, 2do", nullptr es una palabra clave, puede convertir automáticamente a cada tipo de puntero pero no de tipo entero, esto supera el inconveniente de NULL, que es ambiguo para la siguiente función de sobrecarga : void f (int); void f (void *);

f (NULO); // Ambiguous f (nullptr); // OKAY

Probar esta característica en VC2010 muestra que el documento de MSDN entra en conflicto con el compilador real, decía el documento:

La palabra clave nullptr no es un tipo y no es compatible con:

tamaño de

Tidido

lanzar nullptr

En realidad, en VC2010, todos los operadores / expresiones anteriores son legales. sizeof (nullptr) resultado 4. typeid.name () result std :: nullptr_t, y throw nullptr puede ser capturado por "const void *" y "void *" (y otros tipos de puntero).

Mientras que gcc (4.7.1) parece más rígido sobre nullptr, throw nullptr no puede ser capturado por "void *", puede ser capturado por ''...''


Parece que gcc admite nullptr desde 4.6 .


Se ve por gcc 4.6.1 (Ubuntu 11.11 oneiric), se ha agregado nullptr.

Un rápido y recursivo sed de buscar y reemplazar en mis archivos hpp / cpp funcionó bien para mí:

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


La propuesta oficial tiene una solución alternativa:

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