Is nullptr falsy?Do you use NULL or 0 (zero) for pointers in C++?Is it bad to depend on index 0 of an empty std::string?Nullptr and checking if a pointer points to a valid objectWhat exactly is nullptr?Can nullptr be emulated in gcc?Is the safe-bool idiom obsolete in C++11?Why can't nullptr convert to int?What are the advantages of using nullptr?boost spirit how to access child nodes (leaves) from parent nodesStrange bool valuesImplicit conversion of stream to boolComparing two type_info from typeid() operator

How to train a replacement without them knowing?

Why do so many people play out of turn on the last lead?

What are some tips and tricks for finding the cheapest flight when luggage and other fees are not revealed until far into the booking process?

A Magic Diamond

How can I enter recovery mode (for Mac OS, on an iMac) remotely?

What's the relationship betweeen MS-DOS and XENIX?

Can a countable set contain uncountably many infinite subsets such that the symmetric difference of any two such distinct subsets is finite?

What modifiers are added to the attack and damage rolls of this unique longbow from Waterdeep: Dragon Heist?

What is the question mark?

How do ultra-stable oscillators for spacecraft work?

Why does auto deduce this variable as double and not float?

Have there ever been other TV shows or Films that told a similiar story to the new 90210 show?

Why should I pay for an SSL certificate?

Setting up a Mathematical Institute of Refereeing?

Unconventional examples of mathematical modelling

How would armour (and combat) change if the fighter didn't need to actually wear it?

Typesetting "hollow slash"

Is the Microsoft recommendation to use C# properties applicable to game development?

What should I do with the stock I own if I anticipate there will be a recession?

Weird resistor with dots around it on the schematic

What's the point of writing that I know will never be used or read?

Good way to stop electrolyte tabs from turning into powder?

What was the intention with the Commodore 128?

What are these panels underneath the wing root of a A380?



Is nullptr falsy?


Do you use NULL or 0 (zero) for pointers in C++?Is it bad to depend on index 0 of an empty std::string?Nullptr and checking if a pointer points to a valid objectWhat exactly is nullptr?Can nullptr be emulated in gcc?Is the safe-bool idiom obsolete in C++11?Why can't nullptr convert to int?What are the advantages of using nullptr?boost spirit how to access child nodes (leaves) from parent nodesStrange bool valuesImplicit conversion of stream to boolComparing two type_info from typeid() operator






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








8















When used as a boolean expression or transformed into a boolean either explicitly or implicitly, is nullptr consistently false? Is this implementation defined or specified in the standard?



I wrote some code to test, but am not certain if it tests this property fully. I couldn't find an existing SO answer that talked specifically about this. cppreference doesn't mention this from what I see.



if (nullptr) 
;
else
std::cout << "Evaluates to false implicitlyn";


if (!nullptr)
std::cout << "Evaluates to false if operated onn";


if (!(bool)(nullptr))
std::cout << "Evaluates to false if explicitly cast to booln";



Expected and actual:



Evaluates to false implicitly
Evaluates to false if operated on
Evaluates to false if explicitly cast to bool









share|improve this question









New contributor



David Thompson is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





















  • stackoverflow.com/a/177007/8038186

    – KorelK
    9 hours ago






  • 5





    Huh, true, cppreference doesn't say it. At least not directly.

    – Lightness Races in Orbit
    9 hours ago






  • 2





    "is nullptr consistently false?" - Yes.

    – Jesper Juhl
    9 hours ago






  • 3





    found it here: en.cppreference.com/w/cpp/language/implicit_conversion and scroll down to "§Boolean conversions". I agree it should be mentioned on en.cppreference.com/w/cpp/language/nullptr

    – bolov
    8 hours ago

















8















When used as a boolean expression or transformed into a boolean either explicitly or implicitly, is nullptr consistently false? Is this implementation defined or specified in the standard?



I wrote some code to test, but am not certain if it tests this property fully. I couldn't find an existing SO answer that talked specifically about this. cppreference doesn't mention this from what I see.



if (nullptr) 
;
else
std::cout << "Evaluates to false implicitlyn";


if (!nullptr)
std::cout << "Evaluates to false if operated onn";


if (!(bool)(nullptr))
std::cout << "Evaluates to false if explicitly cast to booln";



Expected and actual:



Evaluates to false implicitly
Evaluates to false if operated on
Evaluates to false if explicitly cast to bool









share|improve this question









New contributor



David Thompson is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





















  • stackoverflow.com/a/177007/8038186

    – KorelK
    9 hours ago






  • 5





    Huh, true, cppreference doesn't say it. At least not directly.

    – Lightness Races in Orbit
    9 hours ago






  • 2





    "is nullptr consistently false?" - Yes.

    – Jesper Juhl
    9 hours ago






  • 3





    found it here: en.cppreference.com/w/cpp/language/implicit_conversion and scroll down to "§Boolean conversions". I agree it should be mentioned on en.cppreference.com/w/cpp/language/nullptr

    – bolov
    8 hours ago













8












8








8








When used as a boolean expression or transformed into a boolean either explicitly or implicitly, is nullptr consistently false? Is this implementation defined or specified in the standard?



I wrote some code to test, but am not certain if it tests this property fully. I couldn't find an existing SO answer that talked specifically about this. cppreference doesn't mention this from what I see.



if (nullptr) 
;
else
std::cout << "Evaluates to false implicitlyn";


if (!nullptr)
std::cout << "Evaluates to false if operated onn";


if (!(bool)(nullptr))
std::cout << "Evaluates to false if explicitly cast to booln";



Expected and actual:



Evaluates to false implicitly
Evaluates to false if operated on
Evaluates to false if explicitly cast to bool









share|improve this question









New contributor



David Thompson is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











When used as a boolean expression or transformed into a boolean either explicitly or implicitly, is nullptr consistently false? Is this implementation defined or specified in the standard?



I wrote some code to test, but am not certain if it tests this property fully. I couldn't find an existing SO answer that talked specifically about this. cppreference doesn't mention this from what I see.



if (nullptr) 
;
else
std::cout << "Evaluates to false implicitlyn";


if (!nullptr)
std::cout << "Evaluates to false if operated onn";


if (!(bool)(nullptr))
std::cout << "Evaluates to false if explicitly cast to booln";



Expected and actual:



Evaluates to false implicitly
Evaluates to false if operated on
Evaluates to false if explicitly cast to bool






c++ c++11 implicit-conversion nullptr






share|improve this question









New contributor



David Thompson is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.










share|improve this question









New contributor



David Thompson is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.








share|improve this question




share|improve this question








edited 8 hours ago









Vlad from Moscow

150k13 gold badges91 silver badges191 bronze badges




150k13 gold badges91 silver badges191 bronze badges






New contributor



David Thompson is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.








asked 9 hours ago









David ThompsonDavid Thompson

433 bronze badges




433 bronze badges




New contributor



David Thompson is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.




New contributor




David Thompson is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.

















  • stackoverflow.com/a/177007/8038186

    – KorelK
    9 hours ago






  • 5





    Huh, true, cppreference doesn't say it. At least not directly.

    – Lightness Races in Orbit
    9 hours ago






  • 2





    "is nullptr consistently false?" - Yes.

    – Jesper Juhl
    9 hours ago






  • 3





    found it here: en.cppreference.com/w/cpp/language/implicit_conversion and scroll down to "§Boolean conversions". I agree it should be mentioned on en.cppreference.com/w/cpp/language/nullptr

    – bolov
    8 hours ago

















  • stackoverflow.com/a/177007/8038186

    – KorelK
    9 hours ago






  • 5





    Huh, true, cppreference doesn't say it. At least not directly.

    – Lightness Races in Orbit
    9 hours ago






  • 2





    "is nullptr consistently false?" - Yes.

    – Jesper Juhl
    9 hours ago






  • 3





    found it here: en.cppreference.com/w/cpp/language/implicit_conversion and scroll down to "§Boolean conversions". I agree it should be mentioned on en.cppreference.com/w/cpp/language/nullptr

    – bolov
    8 hours ago
















stackoverflow.com/a/177007/8038186

– KorelK
9 hours ago





stackoverflow.com/a/177007/8038186

– KorelK
9 hours ago




5




5





Huh, true, cppreference doesn't say it. At least not directly.

– Lightness Races in Orbit
9 hours ago





Huh, true, cppreference doesn't say it. At least not directly.

– Lightness Races in Orbit
9 hours ago




2




2





"is nullptr consistently false?" - Yes.

– Jesper Juhl
9 hours ago





"is nullptr consistently false?" - Yes.

– Jesper Juhl
9 hours ago




3




3





found it here: en.cppreference.com/w/cpp/language/implicit_conversion and scroll down to "§Boolean conversions". I agree it should be mentioned on en.cppreference.com/w/cpp/language/nullptr

– bolov
8 hours ago





found it here: en.cppreference.com/w/cpp/language/implicit_conversion and scroll down to "§Boolean conversions". I agree it should be mentioned on en.cppreference.com/w/cpp/language/nullptr

– bolov
8 hours ago












3 Answers
3






active

oldest

votes


















11














According to the C++ 17 Standard (5.13.7 Pointer literals)




1 The pointer literal is the keyword nullptr. It is a prvalue of type
std::nullptr_t. [ Note: std::nullptr_t is a distinct type that is
neither a pointer type nor a pointer-to-member type; rather, a prvalue
of this type is a null pointer constant
and can be converted to a
null pointer value or null member pointer value. See 7.11 and 7.12. —
end note ]




And (7 Standard conversions)




4 Certain language constructs require that an expression be converted
to a Boolean value. An expression e appearing in such a context is
said to be contextually converted to bool and is well-formed if and
only if the declaration bool t(e); is well-formed
, for some invented
temporary variable t (11.6).




And at last (7.14 Boolean conversions)




1 A prvalue of arithmetic, unscoped enumeration, pointer, or
pointer-to-member type can be converted to a prvalue of type bool. A
zero value, null pointer value, or null member pointer value is
converted to false; any other value is converted to true. For
direct-initialization (11.6), a prvalue of type std::nullptr_t can be
converted to a prvalue of type bool; the resulting value is false.




That is you may write for example



bool b( nullptr );


but you may not write (though some compilers have a bug relative to this)



bool b = nullptr;


So nullptr can be contextually converted to an object of the type bool for example in selection statements like the if-statement.



Let's consider for example the unary operator ! as in an if statement



if ( !nullptr ) /*...*/ 


According to the description of the operator (8.5.2.1 Unary operators)




9 The operand of the logical negation operator ! is contextually
converted to bool
(Clause 7); its value is true if the converted
operand is false and false otherwise. The type of the result is bool




So nullptr in this expression is not converted to a pointer. It is directly contextually converted to bool.






share|improve this answer


































    4














    The result of your code is guaranteed, [dcl.init]/17.8




    Otherwise, if the initialization is direct-initialization, the source type is std​::​nullptr_­t, and the destination type is bool, the initial value of the object being initialized is false.




    That means, for direct-initialization, a bool object may be initialized from nullptr, with the result value false. Then for (bool)(nullptr), nullptr is converted to bool with value false.



    When using nullptr as condition of if or the operand of operator!, it's considered as contextual conversions,




    the implicit conversion is performed if the declaration bool t(e); is well-formed




    That means, both if (nullptr) and !nullptr, nullptr will be converted to bool with value false.






    share|improve this answer






















    • 2





      It is an incorrect answer. std::nullptr_t is a distinct type that is neither a pointer type nor a pointer-to-member type. nullptr t is a null pointer constant and can be contextually converted to bool.

      – Vlad from Moscow
      9 hours ago



















    2














    Yes, but you should avoid using this fact.



    Comparing pointers to false, or to 0, is a common trope in C/C++ coding. I suggest that you avoid using it. If you want to check for nullness, use:



    if (x == nullptr) /* ... */


    rather than



    if (!x) /* ... */


    or



    if (not x) /* ... */


    The second variant adds another bit of confusion for the reader: What is x? Is it a boolean? A plain value (e.g. an integer)? A pointer? An optional? Even if x has a meaningful name, it won't help you much: if (!network_connection) ... it could still be a complex structure convertible to an integer or a boolean, it might be a boolean indicator of whether there's a connection, it could a pointer, a value or an optional. Or something else.



    Also, remembering that nullptr evaluates to false is another bit of information you need to store in the back of your brain to properly decode the code you're reading. We may be used to it from the olden days or from reading other people's code - but if we weren't, it would not have been obvious that nullptr behaves like that. In a sense, it's not dissimilar for other obscure guarantees, like how the value at index 0 of an empty std::string is guaranteed to be . Just don't make your code rely on this stuff unless you absolutely have to.




    PS : There is actually a lot less use for null pointers these days. You can force pointer to never be null if they don't need to; you can use references instead of pointers; and you can use std::optional<T> to return either a T or "no T". Perhaps you could just avoid mentioning nullptr altogether.






    share|improve this answer






















    • 1





      I strongly disagree with your advice. C is about how and C++ is about what. That's why you have auto: it means that you don't need to know the type. In the same line, if (!network_connection) is clear, and you shouldn't care whether network_connection is a class convertible to bool or a pointer. The code in C++ should express intent from the programmer.

      – Mirko
      4 hours ago











    • @Mirko: Even if you're interested in "what", then "not x" is still often kind of confusing.

      – einpoklum
      3 hours ago













    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );






    David Thompson is a new contributor. Be nice, and check out our Code of Conduct.









    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f57527189%2fis-nullptr-falsy%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    11














    According to the C++ 17 Standard (5.13.7 Pointer literals)




    1 The pointer literal is the keyword nullptr. It is a prvalue of type
    std::nullptr_t. [ Note: std::nullptr_t is a distinct type that is
    neither a pointer type nor a pointer-to-member type; rather, a prvalue
    of this type is a null pointer constant
    and can be converted to a
    null pointer value or null member pointer value. See 7.11 and 7.12. —
    end note ]




    And (7 Standard conversions)




    4 Certain language constructs require that an expression be converted
    to a Boolean value. An expression e appearing in such a context is
    said to be contextually converted to bool and is well-formed if and
    only if the declaration bool t(e); is well-formed
    , for some invented
    temporary variable t (11.6).




    And at last (7.14 Boolean conversions)




    1 A prvalue of arithmetic, unscoped enumeration, pointer, or
    pointer-to-member type can be converted to a prvalue of type bool. A
    zero value, null pointer value, or null member pointer value is
    converted to false; any other value is converted to true. For
    direct-initialization (11.6), a prvalue of type std::nullptr_t can be
    converted to a prvalue of type bool; the resulting value is false.




    That is you may write for example



    bool b( nullptr );


    but you may not write (though some compilers have a bug relative to this)



    bool b = nullptr;


    So nullptr can be contextually converted to an object of the type bool for example in selection statements like the if-statement.



    Let's consider for example the unary operator ! as in an if statement



    if ( !nullptr ) /*...*/ 


    According to the description of the operator (8.5.2.1 Unary operators)




    9 The operand of the logical negation operator ! is contextually
    converted to bool
    (Clause 7); its value is true if the converted
    operand is false and false otherwise. The type of the result is bool




    So nullptr in this expression is not converted to a pointer. It is directly contextually converted to bool.






    share|improve this answer































      11














      According to the C++ 17 Standard (5.13.7 Pointer literals)




      1 The pointer literal is the keyword nullptr. It is a prvalue of type
      std::nullptr_t. [ Note: std::nullptr_t is a distinct type that is
      neither a pointer type nor a pointer-to-member type; rather, a prvalue
      of this type is a null pointer constant
      and can be converted to a
      null pointer value or null member pointer value. See 7.11 and 7.12. —
      end note ]




      And (7 Standard conversions)




      4 Certain language constructs require that an expression be converted
      to a Boolean value. An expression e appearing in such a context is
      said to be contextually converted to bool and is well-formed if and
      only if the declaration bool t(e); is well-formed
      , for some invented
      temporary variable t (11.6).




      And at last (7.14 Boolean conversions)




      1 A prvalue of arithmetic, unscoped enumeration, pointer, or
      pointer-to-member type can be converted to a prvalue of type bool. A
      zero value, null pointer value, or null member pointer value is
      converted to false; any other value is converted to true. For
      direct-initialization (11.6), a prvalue of type std::nullptr_t can be
      converted to a prvalue of type bool; the resulting value is false.




      That is you may write for example



      bool b( nullptr );


      but you may not write (though some compilers have a bug relative to this)



      bool b = nullptr;


      So nullptr can be contextually converted to an object of the type bool for example in selection statements like the if-statement.



      Let's consider for example the unary operator ! as in an if statement



      if ( !nullptr ) /*...*/ 


      According to the description of the operator (8.5.2.1 Unary operators)




      9 The operand of the logical negation operator ! is contextually
      converted to bool
      (Clause 7); its value is true if the converted
      operand is false and false otherwise. The type of the result is bool




      So nullptr in this expression is not converted to a pointer. It is directly contextually converted to bool.






      share|improve this answer





























        11












        11








        11







        According to the C++ 17 Standard (5.13.7 Pointer literals)




        1 The pointer literal is the keyword nullptr. It is a prvalue of type
        std::nullptr_t. [ Note: std::nullptr_t is a distinct type that is
        neither a pointer type nor a pointer-to-member type; rather, a prvalue
        of this type is a null pointer constant
        and can be converted to a
        null pointer value or null member pointer value. See 7.11 and 7.12. —
        end note ]




        And (7 Standard conversions)




        4 Certain language constructs require that an expression be converted
        to a Boolean value. An expression e appearing in such a context is
        said to be contextually converted to bool and is well-formed if and
        only if the declaration bool t(e); is well-formed
        , for some invented
        temporary variable t (11.6).




        And at last (7.14 Boolean conversions)




        1 A prvalue of arithmetic, unscoped enumeration, pointer, or
        pointer-to-member type can be converted to a prvalue of type bool. A
        zero value, null pointer value, or null member pointer value is
        converted to false; any other value is converted to true. For
        direct-initialization (11.6), a prvalue of type std::nullptr_t can be
        converted to a prvalue of type bool; the resulting value is false.




        That is you may write for example



        bool b( nullptr );


        but you may not write (though some compilers have a bug relative to this)



        bool b = nullptr;


        So nullptr can be contextually converted to an object of the type bool for example in selection statements like the if-statement.



        Let's consider for example the unary operator ! as in an if statement



        if ( !nullptr ) /*...*/ 


        According to the description of the operator (8.5.2.1 Unary operators)




        9 The operand of the logical negation operator ! is contextually
        converted to bool
        (Clause 7); its value is true if the converted
        operand is false and false otherwise. The type of the result is bool




        So nullptr in this expression is not converted to a pointer. It is directly contextually converted to bool.






        share|improve this answer















        According to the C++ 17 Standard (5.13.7 Pointer literals)




        1 The pointer literal is the keyword nullptr. It is a prvalue of type
        std::nullptr_t. [ Note: std::nullptr_t is a distinct type that is
        neither a pointer type nor a pointer-to-member type; rather, a prvalue
        of this type is a null pointer constant
        and can be converted to a
        null pointer value or null member pointer value. See 7.11 and 7.12. —
        end note ]




        And (7 Standard conversions)




        4 Certain language constructs require that an expression be converted
        to a Boolean value. An expression e appearing in such a context is
        said to be contextually converted to bool and is well-formed if and
        only if the declaration bool t(e); is well-formed
        , for some invented
        temporary variable t (11.6).




        And at last (7.14 Boolean conversions)




        1 A prvalue of arithmetic, unscoped enumeration, pointer, or
        pointer-to-member type can be converted to a prvalue of type bool. A
        zero value, null pointer value, or null member pointer value is
        converted to false; any other value is converted to true. For
        direct-initialization (11.6), a prvalue of type std::nullptr_t can be
        converted to a prvalue of type bool; the resulting value is false.




        That is you may write for example



        bool b( nullptr );


        but you may not write (though some compilers have a bug relative to this)



        bool b = nullptr;


        So nullptr can be contextually converted to an object of the type bool for example in selection statements like the if-statement.



        Let's consider for example the unary operator ! as in an if statement



        if ( !nullptr ) /*...*/ 


        According to the description of the operator (8.5.2.1 Unary operators)




        9 The operand of the logical negation operator ! is contextually
        converted to bool
        (Clause 7); its value is true if the converted
        operand is false and false otherwise. The type of the result is bool




        So nullptr in this expression is not converted to a pointer. It is directly contextually converted to bool.







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 8 hours ago

























        answered 8 hours ago









        Vlad from MoscowVlad from Moscow

        150k13 gold badges91 silver badges191 bronze badges




        150k13 gold badges91 silver badges191 bronze badges


























            4














            The result of your code is guaranteed, [dcl.init]/17.8




            Otherwise, if the initialization is direct-initialization, the source type is std​::​nullptr_­t, and the destination type is bool, the initial value of the object being initialized is false.




            That means, for direct-initialization, a bool object may be initialized from nullptr, with the result value false. Then for (bool)(nullptr), nullptr is converted to bool with value false.



            When using nullptr as condition of if or the operand of operator!, it's considered as contextual conversions,




            the implicit conversion is performed if the declaration bool t(e); is well-formed




            That means, both if (nullptr) and !nullptr, nullptr will be converted to bool with value false.






            share|improve this answer






















            • 2





              It is an incorrect answer. std::nullptr_t is a distinct type that is neither a pointer type nor a pointer-to-member type. nullptr t is a null pointer constant and can be contextually converted to bool.

              – Vlad from Moscow
              9 hours ago
















            4














            The result of your code is guaranteed, [dcl.init]/17.8




            Otherwise, if the initialization is direct-initialization, the source type is std​::​nullptr_­t, and the destination type is bool, the initial value of the object being initialized is false.




            That means, for direct-initialization, a bool object may be initialized from nullptr, with the result value false. Then for (bool)(nullptr), nullptr is converted to bool with value false.



            When using nullptr as condition of if or the operand of operator!, it's considered as contextual conversions,




            the implicit conversion is performed if the declaration bool t(e); is well-formed




            That means, both if (nullptr) and !nullptr, nullptr will be converted to bool with value false.






            share|improve this answer






















            • 2





              It is an incorrect answer. std::nullptr_t is a distinct type that is neither a pointer type nor a pointer-to-member type. nullptr t is a null pointer constant and can be contextually converted to bool.

              – Vlad from Moscow
              9 hours ago














            4












            4








            4







            The result of your code is guaranteed, [dcl.init]/17.8




            Otherwise, if the initialization is direct-initialization, the source type is std​::​nullptr_­t, and the destination type is bool, the initial value of the object being initialized is false.




            That means, for direct-initialization, a bool object may be initialized from nullptr, with the result value false. Then for (bool)(nullptr), nullptr is converted to bool with value false.



            When using nullptr as condition of if or the operand of operator!, it's considered as contextual conversions,




            the implicit conversion is performed if the declaration bool t(e); is well-formed




            That means, both if (nullptr) and !nullptr, nullptr will be converted to bool with value false.






            share|improve this answer















            The result of your code is guaranteed, [dcl.init]/17.8




            Otherwise, if the initialization is direct-initialization, the source type is std​::​nullptr_­t, and the destination type is bool, the initial value of the object being initialized is false.




            That means, for direct-initialization, a bool object may be initialized from nullptr, with the result value false. Then for (bool)(nullptr), nullptr is converted to bool with value false.



            When using nullptr as condition of if or the operand of operator!, it's considered as contextual conversions,




            the implicit conversion is performed if the declaration bool t(e); is well-formed




            That means, both if (nullptr) and !nullptr, nullptr will be converted to bool with value false.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited 8 hours ago

























            answered 9 hours ago









            songyuanyaosongyuanyao

            104k11 gold badges200 silver badges270 bronze badges




            104k11 gold badges200 silver badges270 bronze badges










            • 2





              It is an incorrect answer. std::nullptr_t is a distinct type that is neither a pointer type nor a pointer-to-member type. nullptr t is a null pointer constant and can be contextually converted to bool.

              – Vlad from Moscow
              9 hours ago













            • 2





              It is an incorrect answer. std::nullptr_t is a distinct type that is neither a pointer type nor a pointer-to-member type. nullptr t is a null pointer constant and can be contextually converted to bool.

              – Vlad from Moscow
              9 hours ago








            2




            2





            It is an incorrect answer. std::nullptr_t is a distinct type that is neither a pointer type nor a pointer-to-member type. nullptr t is a null pointer constant and can be contextually converted to bool.

            – Vlad from Moscow
            9 hours ago






            It is an incorrect answer. std::nullptr_t is a distinct type that is neither a pointer type nor a pointer-to-member type. nullptr t is a null pointer constant and can be contextually converted to bool.

            – Vlad from Moscow
            9 hours ago












            2














            Yes, but you should avoid using this fact.



            Comparing pointers to false, or to 0, is a common trope in C/C++ coding. I suggest that you avoid using it. If you want to check for nullness, use:



            if (x == nullptr) /* ... */


            rather than



            if (!x) /* ... */


            or



            if (not x) /* ... */


            The second variant adds another bit of confusion for the reader: What is x? Is it a boolean? A plain value (e.g. an integer)? A pointer? An optional? Even if x has a meaningful name, it won't help you much: if (!network_connection) ... it could still be a complex structure convertible to an integer or a boolean, it might be a boolean indicator of whether there's a connection, it could a pointer, a value or an optional. Or something else.



            Also, remembering that nullptr evaluates to false is another bit of information you need to store in the back of your brain to properly decode the code you're reading. We may be used to it from the olden days or from reading other people's code - but if we weren't, it would not have been obvious that nullptr behaves like that. In a sense, it's not dissimilar for other obscure guarantees, like how the value at index 0 of an empty std::string is guaranteed to be . Just don't make your code rely on this stuff unless you absolutely have to.




            PS : There is actually a lot less use for null pointers these days. You can force pointer to never be null if they don't need to; you can use references instead of pointers; and you can use std::optional<T> to return either a T or "no T". Perhaps you could just avoid mentioning nullptr altogether.






            share|improve this answer






















            • 1





              I strongly disagree with your advice. C is about how and C++ is about what. That's why you have auto: it means that you don't need to know the type. In the same line, if (!network_connection) is clear, and you shouldn't care whether network_connection is a class convertible to bool or a pointer. The code in C++ should express intent from the programmer.

              – Mirko
              4 hours ago











            • @Mirko: Even if you're interested in "what", then "not x" is still often kind of confusing.

              – einpoklum
              3 hours ago















            2














            Yes, but you should avoid using this fact.



            Comparing pointers to false, or to 0, is a common trope in C/C++ coding. I suggest that you avoid using it. If you want to check for nullness, use:



            if (x == nullptr) /* ... */


            rather than



            if (!x) /* ... */


            or



            if (not x) /* ... */


            The second variant adds another bit of confusion for the reader: What is x? Is it a boolean? A plain value (e.g. an integer)? A pointer? An optional? Even if x has a meaningful name, it won't help you much: if (!network_connection) ... it could still be a complex structure convertible to an integer or a boolean, it might be a boolean indicator of whether there's a connection, it could a pointer, a value or an optional. Or something else.



            Also, remembering that nullptr evaluates to false is another bit of information you need to store in the back of your brain to properly decode the code you're reading. We may be used to it from the olden days or from reading other people's code - but if we weren't, it would not have been obvious that nullptr behaves like that. In a sense, it's not dissimilar for other obscure guarantees, like how the value at index 0 of an empty std::string is guaranteed to be . Just don't make your code rely on this stuff unless you absolutely have to.




            PS : There is actually a lot less use for null pointers these days. You can force pointer to never be null if they don't need to; you can use references instead of pointers; and you can use std::optional<T> to return either a T or "no T". Perhaps you could just avoid mentioning nullptr altogether.






            share|improve this answer






















            • 1





              I strongly disagree with your advice. C is about how and C++ is about what. That's why you have auto: it means that you don't need to know the type. In the same line, if (!network_connection) is clear, and you shouldn't care whether network_connection is a class convertible to bool or a pointer. The code in C++ should express intent from the programmer.

              – Mirko
              4 hours ago











            • @Mirko: Even if you're interested in "what", then "not x" is still often kind of confusing.

              – einpoklum
              3 hours ago













            2












            2








            2







            Yes, but you should avoid using this fact.



            Comparing pointers to false, or to 0, is a common trope in C/C++ coding. I suggest that you avoid using it. If you want to check for nullness, use:



            if (x == nullptr) /* ... */


            rather than



            if (!x) /* ... */


            or



            if (not x) /* ... */


            The second variant adds another bit of confusion for the reader: What is x? Is it a boolean? A plain value (e.g. an integer)? A pointer? An optional? Even if x has a meaningful name, it won't help you much: if (!network_connection) ... it could still be a complex structure convertible to an integer or a boolean, it might be a boolean indicator of whether there's a connection, it could a pointer, a value or an optional. Or something else.



            Also, remembering that nullptr evaluates to false is another bit of information you need to store in the back of your brain to properly decode the code you're reading. We may be used to it from the olden days or from reading other people's code - but if we weren't, it would not have been obvious that nullptr behaves like that. In a sense, it's not dissimilar for other obscure guarantees, like how the value at index 0 of an empty std::string is guaranteed to be . Just don't make your code rely on this stuff unless you absolutely have to.




            PS : There is actually a lot less use for null pointers these days. You can force pointer to never be null if they don't need to; you can use references instead of pointers; and you can use std::optional<T> to return either a T or "no T". Perhaps you could just avoid mentioning nullptr altogether.






            share|improve this answer















            Yes, but you should avoid using this fact.



            Comparing pointers to false, or to 0, is a common trope in C/C++ coding. I suggest that you avoid using it. If you want to check for nullness, use:



            if (x == nullptr) /* ... */


            rather than



            if (!x) /* ... */


            or



            if (not x) /* ... */


            The second variant adds another bit of confusion for the reader: What is x? Is it a boolean? A plain value (e.g. an integer)? A pointer? An optional? Even if x has a meaningful name, it won't help you much: if (!network_connection) ... it could still be a complex structure convertible to an integer or a boolean, it might be a boolean indicator of whether there's a connection, it could a pointer, a value or an optional. Or something else.



            Also, remembering that nullptr evaluates to false is another bit of information you need to store in the back of your brain to properly decode the code you're reading. We may be used to it from the olden days or from reading other people's code - but if we weren't, it would not have been obvious that nullptr behaves like that. In a sense, it's not dissimilar for other obscure guarantees, like how the value at index 0 of an empty std::string is guaranteed to be . Just don't make your code rely on this stuff unless you absolutely have to.




            PS : There is actually a lot less use for null pointers these days. You can force pointer to never be null if they don't need to; you can use references instead of pointers; and you can use std::optional<T> to return either a T or "no T". Perhaps you could just avoid mentioning nullptr altogether.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited 7 hours ago

























            answered 7 hours ago









            einpoklumeinpoklum

            42.1k28 gold badges147 silver badges292 bronze badges




            42.1k28 gold badges147 silver badges292 bronze badges










            • 1





              I strongly disagree with your advice. C is about how and C++ is about what. That's why you have auto: it means that you don't need to know the type. In the same line, if (!network_connection) is clear, and you shouldn't care whether network_connection is a class convertible to bool or a pointer. The code in C++ should express intent from the programmer.

              – Mirko
              4 hours ago











            • @Mirko: Even if you're interested in "what", then "not x" is still often kind of confusing.

              – einpoklum
              3 hours ago












            • 1





              I strongly disagree with your advice. C is about how and C++ is about what. That's why you have auto: it means that you don't need to know the type. In the same line, if (!network_connection) is clear, and you shouldn't care whether network_connection is a class convertible to bool or a pointer. The code in C++ should express intent from the programmer.

              – Mirko
              4 hours ago











            • @Mirko: Even if you're interested in "what", then "not x" is still often kind of confusing.

              – einpoklum
              3 hours ago







            1




            1





            I strongly disagree with your advice. C is about how and C++ is about what. That's why you have auto: it means that you don't need to know the type. In the same line, if (!network_connection) is clear, and you shouldn't care whether network_connection is a class convertible to bool or a pointer. The code in C++ should express intent from the programmer.

            – Mirko
            4 hours ago





            I strongly disagree with your advice. C is about how and C++ is about what. That's why you have auto: it means that you don't need to know the type. In the same line, if (!network_connection) is clear, and you shouldn't care whether network_connection is a class convertible to bool or a pointer. The code in C++ should express intent from the programmer.

            – Mirko
            4 hours ago













            @Mirko: Even if you're interested in "what", then "not x" is still often kind of confusing.

            – einpoklum
            3 hours ago





            @Mirko: Even if you're interested in "what", then "not x" is still often kind of confusing.

            – einpoklum
            3 hours ago










            David Thompson is a new contributor. Be nice, and check out our Code of Conduct.









            draft saved

            draft discarded


















            David Thompson is a new contributor. Be nice, and check out our Code of Conduct.












            David Thompson is a new contributor. Be nice, and check out our Code of Conduct.











            David Thompson is a new contributor. Be nice, and check out our Code of Conduct.














            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f57527189%2fis-nullptr-falsy%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            19. јануар Садржај Догађаји Рођења Смрти Празници и дани сећања Види још Референце Мени за навигацијуу

            Israel Cuprins Etimologie | Istorie | Geografie | Politică | Demografie | Educație | Economie | Cultură | Note explicative | Note bibliografice | Bibliografie | Legături externe | Meniu de navigaresite web oficialfacebooktweeterGoogle+Instagramcanal YouTubeInstagramtextmodificaremodificarewww.technion.ac.ilnew.huji.ac.ilwww.weizmann.ac.ilwww1.biu.ac.ilenglish.tau.ac.ilwww.haifa.ac.ilin.bgu.ac.ilwww.openu.ac.ilwww.ariel.ac.ilCIA FactbookHarta Israelului"Negotiating Jerusalem," Palestine–Israel JournalThe Schizoid Nature of Modern Hebrew: A Slavic Language in Search of a Semitic Past„Arabic in Israel: an official language and a cultural bridge”„Latest Population Statistics for Israel”„Israel Population”„Tables”„Report for Selected Countries and Subjects”Human Development Report 2016: Human Development for Everyone„Distribution of family income - Gini index”The World FactbookJerusalem Law„Israel”„Israel”„Zionist Leaders: David Ben-Gurion 1886–1973”„The status of Jerusalem”„Analysis: Kadima's big plans”„Israel's Hard-Learned Lessons”„The Legacy of Undefined Borders, Tel Aviv Notes No. 40, 5 iunie 2002”„Israel Journal: A Land Without Borders”„Population”„Israel closes decade with population of 7.5 million”Time Series-DataBank„Selected Statistics on Jerusalem Day 2007 (Hebrew)”Golan belongs to Syria, Druze protestGlobal Survey 2006: Middle East Progress Amid Global Gains in FreedomWHO: Life expectancy in Israel among highest in the worldInternational Monetary Fund, World Economic Outlook Database, April 2011: Nominal GDP list of countries. Data for the year 2010.„Israel's accession to the OECD”Popular Opinion„On the Move”Hosea 12:5„Walking the Bible Timeline”„Palestine: History”„Return to Zion”An invention called 'the Jewish people' – Haaretz – Israel NewsoriginalJewish and Non-Jewish Population of Palestine-Israel (1517–2004)ImmigrationJewishvirtuallibrary.orgChapter One: The Heralders of Zionism„The birth of modern Israel: A scrap of paper that changed history”„League of Nations: The Mandate for Palestine, 24 iulie 1922”The Population of Palestine Prior to 1948originalBackground Paper No. 47 (ST/DPI/SER.A/47)History: Foreign DominationTwo Hundred and Seventh Plenary Meeting„Israel (Labor Zionism)”Population, by Religion and Population GroupThe Suez CrisisAdolf EichmannJustice Ministry Reply to Amnesty International Report„The Interregnum”Israel Ministry of Foreign Affairs – The Palestinian National Covenant- July 1968Research on terrorism: trends, achievements & failuresThe Routledge Atlas of the Arab–Israeli conflict: The Complete History of the Struggle and the Efforts to Resolve It"George Habash, Palestinian Terrorism Tactician, Dies at 82."„1973: Arab states attack Israeli forces”Agranat Commission„Has Israel Annexed East Jerusalem?”original„After 4 Years, Intifada Still Smolders”From the End of the Cold War to 2001originalThe Oslo Accords, 1993Israel-PLO Recognition – Exchange of Letters between PM Rabin and Chairman Arafat – Sept 9- 1993Foundation for Middle East PeaceSources of Population Growth: Total Israeli Population and Settler Population, 1991–2003original„Israel marks Rabin assassination”The Wye River Memorandumoriginal„West Bank barrier route disputed, Israeli missile kills 2”"Permanent Ceasefire to Be Based on Creation Of Buffer Zone Free of Armed Personnel Other than UN, Lebanese Forces"„Hezbollah kills 8 soldiers, kidnaps two in offensive on northern border”„Olmert confirms peace talks with Syria”„Battleground Gaza: Israeli ground forces invade the strip”„IDF begins Gaza troop withdrawal, hours after ending 3-week offensive”„THE LAND: Geography and Climate”„Area of districts, sub-districts, natural regions and lakes”„Israel - Geography”„Makhteshim Country”Israel and the Palestinian Territories„Makhtesh Ramon”„The Living Dead Sea”„Temperatures reach record high in Pakistan”„Climate Extremes In Israel”Israel in figures„Deuteronom”„JNF: 240 million trees planted since 1901”„Vegetation of Israel and Neighboring Countries”Environmental Law in Israel„Executive branch”„Israel's election process explained”„The Electoral System in Israel”„Constitution for Israel”„All 120 incoming Knesset members”„Statul ISRAEL”„The Judiciary: The Court System”„Israel's high court unique in region”„Israel and the International Criminal Court: A Legal Battlefield”„Localities and population, by population group, district, sub-district and natural region”„Israel: Districts, Major Cities, Urban Localities & Metropolitan Areas”„Israel-Egypt Relations: Background & Overview of Peace Treaty”„Solana to Haaretz: New Rules of War Needed for Age of Terror”„Israel's Announcement Regarding Settlements”„United Nations Security Council Resolution 497”„Security Council resolution 478 (1980) on the status of Jerusalem”„Arabs will ask U.N. to seek razing of Israeli wall”„Olmert: Willing to trade land for peace”„Mapping Peace between Syria and Israel”„Egypt: Israel must accept the land-for-peace formula”„Israel: Age structure from 2005 to 2015”„Global, regional, and national disability-adjusted life years (DALYs) for 306 diseases and injuries and healthy life expectancy (HALE) for 188 countries, 1990–2013: quantifying the epidemiological transition”10.1016/S0140-6736(15)61340-X„World Health Statistics 2014”„Life expectancy for Israeli men world's 4th highest”„Family Structure and Well-Being Across Israel's Diverse Population”„Fertility among Jewish and Muslim Women in Israel, by Level of Religiosity, 1979-2009”„Israel leaders in birth rate, but poverty major challenge”„Ethnic Groups”„Israel's population: Over 8.5 million”„Israel - Ethnic groups”„Jews, by country of origin and age”„Minority Communities in Israel: Background & Overview”„Israel”„Language in Israel”„Selected Data from the 2011 Social Survey on Mastery of the Hebrew Language and Usage of Languages”„Religions”„5 facts about Israeli Druze, a unique religious and ethnic group”„Israël”Israel Country Study Guide„Haredi city in Negev – blessing or curse?”„New town Harish harbors hopes of being more than another Pleasantville”„List of localities, in alphabetical order”„Muncitorii români, doriți în Israel”„Prietenia româno-israeliană la nevoie se cunoaște”„The Higher Education System in Israel”„Middle East”„Academic Ranking of World Universities 2016”„Israel”„Israel”„Jewish Nobel Prize Winners”„All Nobel Prizes in Literature”„All Nobel Peace Prizes”„All Prizes in Economic Sciences”„All Nobel Prizes in Chemistry”„List of Fields Medallists”„Sakharov Prize”„Țara care și-a sfidat "destinul" și se bate umăr la umăr cu Silicon Valley”„Apple's R&D center in Israel grew to about 800 employees”„Tim Cook: Apple's Herzliya R&D center second-largest in world”„Lecții de economie de la Israel”„Land use”Israel Investment and Business GuideA Country Study: IsraelCentral Bureau of StatisticsFlorin Diaconu, „Kadima: Flexibilitate și pragmatism, dar nici un compromis în chestiuni vitale", în Revista Institutului Diplomatic Român, anul I, numărul I, semestrul I, 2006, pp. 71-72Florin Diaconu, „Likud: Dreapta israeliană constant opusă retrocedării teritoriilor cureite prin luptă în 1967", în Revista Institutului Diplomatic Român, anul I, numărul I, semestrul I, 2006, pp. 73-74MassadaIsraelul a crescut in 50 de ani cât alte state intr-un mileniuIsrael Government PortalIsraelIsraelIsraelmmmmmXX451232cb118646298(data)4027808-634110000 0004 0372 0767n7900328503691455-bb46-37e3-91d2-cb064a35ffcc1003570400564274ge1294033523775214929302638955X146498911146498911

            Smell Mother Skizze Discussion Tachometer Jar Alligator Star 끌다 자세 의문 과학적t Barbaric The round system critiques the connection. Definition: A wind instrument of music in use among the Spaniards Nasty Level 이상 분노 금년 월급 근교 Cloth Owner Permissible Shock Purring Parched Raise 오전 장면 햄 서투르다 The smash instructs the squeamish instrument. Large Nosy Nalpure Chalk Travel Crayon Bite your tongue The Hulk 신호 대사 사과하다 The work boosts the knowledgeable size. Steeplump Level Wooden Shake Teaching Jump 이제 복도 접다 공중전화 부지런하다 Rub Average Ruthless Busyglide Glost oven Didelphia Control A fly on the wall Jaws 지하철 거