Stephan T. Lavavej: Everything you ever wanted to know about nullptr

Sign in to queue

Description

In C++, 0 is an abused integer. It is used to reflect, well, 0 as a value of type int and it is also used to represent a null pointer... The latter has led to many bugs and confusion over the past 30 years. Put simply, using 0 is and has always been a bad idea (then there's the NULL macro...). Well, my friends, today, with the release of Visual Studio 2010 Beta 2 and the updated C++ language, compilers and libraries that come with it, the abuse of 0 comes to an end: Introducing nullptr the rvalue constant that actually is a null pointer literal.

Who better to dig deep into nullptr (and a few other topics of related interest and importance) than the great and gifted Stephan T. Lavavej? Stephen is a C++ expert and library author who you've met before a few times on C9. Sit back, relax and learn everything you ever wanted to know about nullptr. Thank you, Stephen, for the awesome lesson!

Enjoy!

VC Team Blog: http://blogs.msdn.com/vcblog/default.aspx

Embed

Download

Download this episode

The Discussion

  • User profile image
    raufatay

    Wow, I couldn't have imagined how using NULL could cause so much weirdness

  • User profile image
    tivadj

    Regarding conflicting types nullptr_t in native and unmanaged sides.

     

    In .NET you can't write typeof(null) because null has no type. How it is turned out for nullptr in C++/CLI to have a type?

    Could you elaborate?

  • User profile image
    ryanb

    Another great episode.  I'm always glad to see more STL videos.  Stephan always has a very clear presentation style.  Looking forward to more of these in the future.  We need more material from the C++/native side of things.

     

  • User profile image
    Charles

    You will get it!

    C

  • User profile image
    Fuz

    Regarding the problems with nullptr and C++/CLI.  Does this mean that a third-party template library that uses nullptr (rather than __nullptr) in its headers will be unable to be included in any C++/CLI project?

     

    This is a perfectly feasible situation even in interop code, where you have a C++/CLI type wrapping a C++ type which contains a member from this template library.

     

    This would seem to leave the template library little choice but to define a macro to map to either nullptr or __nullptr depending on whether it's a C++/CLI build or not (which it shouldn't care about, since it's a pure C++0x library), which ends up being worse than the NULL macro!

  • User profile image
    Yves.Dolce

    Great Stephan! Thanks.

  • User profile image
    Damien Watkins

    Hello Fuz

     

    Short answer is “yes”, I agree that this is perfectly reasonable scenario and, unfortunately, “yes” you may to guard the use of “nullptr” to get it correct in all cases.

     

    Just to be clear, if you write a library and only target native development (with anyone’s compiler including ours) then you use nullptr.  If you have a library that is compiled by only Visual C++ and needs to support native and managed, then you use __nullptr for native and nullptr for managed. The issue is if you do the combination of these (multiple compilers and you want to be able to target both native and managed with Visual C++), then you need a guard.

     

    I am not sure I agree with your last statement however, having “nullptr” (in both native and managed code) solves problems that we cannot solve without them. Unfortunately ECMA C++/CLI and ISO C++ selected the same keyword here but that is life with standard-based languages. C++/CLI code already exists and, with all other things being equal, we prefer/defer to the "do not breaking existing code" rule.

     

    Thanks

    Damien

  • User profile image
    Damien Watkins

    Hello Fuz

     

    PS: Stephan post a reply on the VC Blog to this too: http://blogs.msdn.com/vcblog/archive/2009/10/22/visual-studio-2010-beta-2-is-now-available-for-download.aspx#9913727.                                                                                                             

     

    Thanks

    Damien

  • User profile image
    STL

    tivadj: The "managed nullptr" in C++/CLI has no type. The "native nullptr" in C++0x has the type std::nullptr_t.  I've been told by Jonathan Caves, the compiler front-end developer who implemented C++0x's nullptr, that this difference is the major stumbling block to unifying both of them.

  • User profile image
    Fuz

    Hi Damien,

     

    Thanks for replying and I understand all of your points.  Let me just clarify that when I said 'worse than NULL', I meant bigger and uglier in the code, e.g. MYLIBRARY_NULLPTR or something, as opposed to the semantics which are obviously much better.

     

    However, in general, a C++ library author (such as myself) cannot know in advance whether or not his library will be used in a C++/CLI build or not and, to prevent this being a problem, needs to avoid anything that will cause portability issues.  In this case, avoiding nullptr in favour of 'good old 0'.  Obviously this would only be where the semantics don't matter; fortunately, in a template library, you tend to only need to care about the types coming in, rather than the ones you use in the implementation.  But it would've been nice as a self-documentation feature.

     

    Template libraries already have to deal with different compilers (and versions of each compiler) for different reasons; it would've been nice if this otherwise-great new feature didn't have to be avoided or made a special case.

Add Your 2 Cents