Est-ce que C NULL est égal à C ++ 11 nullptr

J’aime utiliser nullptr au lieu de NULL. Maintenant, j’appelle une fonction C (de libjansson dans ce cas).

NULL en C est une implémentation définie .

Pour nullptr j’ai trouvé qu ‘”une constante de pointeur nulle est une expression constante intégrale (5.19) rvalue de type entier qui est évaluée à zéro”.

Donc, la chose la plus sûre à faire:

 auto ssortingng_obj=json_object_get(m_handle,name); if(ssortingng_obj!=NULL) { auto ssortingng=json_ssortingng_value(ssortingng_obj); if(ssortingng!=NULL) {return ssortingng;} } return nullptr; 

Ai-je vraiment besoin de cela ou puis-je le faire plus simplement:

 auto ssortingng_obj=json_object_get(m_handle,name); if(ssortingng_obj!=nullptr) { return json_ssortingng_value(ssortingng_obj); //Assume there is no difference between C NULL and C++11 nullptr } return nullptr; 

    En C ++ 11 et au-delà, un pointeur ==NULL sera également ==nullptr et inversement.

    Les utilisations de NULL autres que la comparaison avec un pointeur (similaire à celui utilisé pour représenter l’octet nul à la fin d’une chaîne) ne fonctionneront pas avec nullptr .

    Dans certains cas, NULL est #define NULL 0 , car la constante entière 0 est spécifiée en C et C ++ lorsque vous la comparez à des pointeurs. Ces informations de type non typées causent des problèmes à la fois en C et en C ++. En C ++, ils ont donc décidé de créer un type et une valeur spéciaux qui font la même chose dans les cas “appropriés”, et échouent de manière fiable à la compilation ” impropres “cas d’utilisation.

    Dans la mesure où votre implémentation C ++ est compatible avec l’implémentation C que vous utilisez (très rare pour que cela ne soit pas vrai), tout devrait fonctionner.


    Pour être très clair, si ptr est un type de pointeur, les expressions suivantes sont équivalentes en C ++:

     ptr == nullptr ptr == NULL ptr == 0 !ptr 

    Comme sont les suivants:

     ptr = nullptr ptr = NULL ptr = 0 

    et si X est un type, les déclarations suivantes le sont aussi:

     X* ptr = nullptr; X* ptr = NULL; X* ptr = 0; 

    nullptr diffère lorsque vous le transmettez à une fonction de modèle qui en déduit un type ( NULL ou 0 devient un int sauf si il est passé à un argument qui attend un pointeur, tandis que nullptr_t rest un nullptr_t ) char c = NULL; ) (note, pas char* c=NULL; )