2011-11-02 13 views
11

Me preguntaba por qué hay dos formas de especificar un puntero nulo. He estado revisando el link, pero no obtuve una comprensión clara de su uso.nullptr vs __nullptr

¿Alguien puede dar un buen ejemplo de cuándo usar qué?

Respuesta

22

El lenguaje C++/CLI ya tenía una palabra clave nullptr desde 2005. Eso causó un problema cuando C++ 11 adoptó la palabra clave nullptr para C++. Ahora hay dos, uno para el código administrado y otro para el código nativo. El compilador C++/CLI puede compilar ambos. Por lo tanto, debe usar __nullptr cuando se refiere al puntero nulo nativo, nullptr cuando se refiere al puntero nulo administrado.

Esto solo es relevante cuando compila con/clr en efecto. Escriba el código C++/CLI en otras palabras. Simplemente use plain nullptr en código C++.

+0

Creo que el poco sobre/clr es probablemente la parte más importante de esta respuesta. Si no está interesado en conectar su código C++ a .NET Framework, entonces siempre debe usar 'nullptr'. –

+0

Siendo realmente pedante, ya era un problema (aunque raramente relevante antes) con portar el código C++ a C++/CLI antes de que existiera C++ 11. – Deduplicator

0

Si leo correctamente, debe usar nullptr para punteros administrados y __nullptr para el puntero no administrado. Sin embargo, dado que nullptr se puede usar tanto para un puntero administrado como no administrado, personalmente no veo una razón para usar __nullptr.

+3

Pero, si está compilando con el modificador/clr, ¿cómo puede saber el compilador si está utilizando C++ 11 'nullptr' o C++/CLI' nullptr'? No puede, que es la razón por la que * debes * usar '__nullptr' cuando te refieres a la versión de C++ 11 cuando estás compilando con el modificador/clr. –

+0

El motivo para usar __nullptr es que si usa nullptr, ** nunca ** podrá activar C++/CLI y utilizar .NET. Lo cual es una gran desventaja en términos de usar código heredado en el futuro. – user3690202

Cuestiones relacionadas