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...
Do living authors still get paid royalties for their old work?
Count the frequency of items in an array
How can I pack my food so it doesn't smell?
Sous vide chicken without an internal temperature of 165
How to compare two different formulations of a problem?
Earliest evidence of objects intended for future archaeologists?
How to think about joining a company whose business I do not understand?
Writing/buying Seforim rather than Sefer Torah
Are there reliable, formulaic ways to form chords on the guitar?
Would it be illegal for Facebook to actively promote a political agenda?
Metal that glows when near pieces of itself
How to get distinct values from an array of arrays in JavaScript using the filter() method?
Is it appropriate for a business to ask me for my credit report?
Mixing colours for a symbol
I think my coworker went through my notebook and took my project ideas
Why should someone be willing to write a strong recommendation even if that means losing a undergraduate from their lab?
How big would a Daddy Longlegs Spider need to be to kill an average Human?
Convert HTML color to OLE
Why does my air conditioner still run, even when it is cooler outside than in?
What is a "click" in Greek or Latin?
How to detect a failed AES256 decryption programmatically?
Sleeping solo in a double sleeping bag
90s(?) book series about two people transported to a parallel medieval world, she joins city watch, he becomes wizard
Church Booleans
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;
}
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
New contributor
add a comment |
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
New contributor
stackoverflow.com/a/177007/8038186
– KorelK
Aug 16 at 15:22
5
Huh, true, cppreference doesn't say it. At least not directly.
– Lightness Races in Orbit
Aug 16 at 15:28
2
"is nullptr consistently false?" - Yes.
– Jesper Juhl
Aug 16 at 15:38
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
Aug 16 at 16:14
@bolov: So just suggest the change there, no need to discuss it here...
– einpoklum
yesterday
add a comment |
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
New contributor
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
c++ c++11 implicit-conversion nullptr
New contributor
New contributor
edited Aug 16 at 16:06
Vlad from Moscow
150k14 gold badges91 silver badges192 bronze badges
150k14 gold badges91 silver badges192 bronze badges
New contributor
asked Aug 16 at 15:19
David ThompsonDavid Thompson
584 bronze badges
584 bronze badges
New contributor
New contributor
stackoverflow.com/a/177007/8038186
– KorelK
Aug 16 at 15:22
5
Huh, true, cppreference doesn't say it. At least not directly.
– Lightness Races in Orbit
Aug 16 at 15:28
2
"is nullptr consistently false?" - Yes.
– Jesper Juhl
Aug 16 at 15:38
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
Aug 16 at 16:14
@bolov: So just suggest the change there, no need to discuss it here...
– einpoklum
yesterday
add a comment |
stackoverflow.com/a/177007/8038186
– KorelK
Aug 16 at 15:22
5
Huh, true, cppreference doesn't say it. At least not directly.
– Lightness Races in Orbit
Aug 16 at 15:28
2
"is nullptr consistently false?" - Yes.
– Jesper Juhl
Aug 16 at 15:38
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
Aug 16 at 16:14
@bolov: So just suggest the change there, no need to discuss it here...
– einpoklum
yesterday
stackoverflow.com/a/177007/8038186
– KorelK
Aug 16 at 15:22
stackoverflow.com/a/177007/8038186
– KorelK
Aug 16 at 15:22
5
5
Huh, true, cppreference doesn't say it. At least not directly.
– Lightness Races in Orbit
Aug 16 at 15:28
Huh, true, cppreference doesn't say it. At least not directly.
– Lightness Races in Orbit
Aug 16 at 15:28
2
2
"is nullptr consistently false?" - Yes.
– Jesper Juhl
Aug 16 at 15:38
"is nullptr consistently false?" - Yes.
– Jesper Juhl
Aug 16 at 15:38
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
Aug 16 at 16:14
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
Aug 16 at 16:14
@bolov: So just suggest the change there, no need to discuss it here...
– einpoklum
yesterday
@bolov: So just suggest the change there, no need to discuss it here...
– einpoklum
yesterday
add a comment |
3 Answers
3
active
oldest
votes
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.
add a comment |
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 isbool
, the initial value of the object being initialized isfalse
.
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
.
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
Aug 16 at 15:42
add a comment |
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.
4
I strongly disagree with your advice. C is about how and C++ is about what. That's why you haveauto
: 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 whethernetwork_connection
is a class convertible tobool
or a pointer. The code in C++ should express intent from the programmer.
– Mirko
Aug 16 at 19:49
@Mirko: Even if you're interested in "what", then "not x" is still often kind of confusing.
– einpoklum
Aug 16 at 21:10
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
add a comment |
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.
add a comment |
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.
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.
edited Aug 16 at 16:25
answered Aug 16 at 15:58
Vlad from MoscowVlad from Moscow
150k14 gold badges91 silver badges192 bronze badges
150k14 gold badges91 silver badges192 bronze badges
add a comment |
add a comment |
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 isbool
, the initial value of the object being initialized isfalse
.
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
.
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
Aug 16 at 15:42
add a comment |
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 isbool
, the initial value of the object being initialized isfalse
.
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
.
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
Aug 16 at 15:42
add a comment |
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 isbool
, the initial value of the object being initialized isfalse
.
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
.
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 isbool
, the initial value of the object being initialized isfalse
.
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
.
edited Aug 16 at 16:27
answered Aug 16 at 15:24
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
Aug 16 at 15:42
add a comment |
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
Aug 16 at 15:42
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
Aug 16 at 15:42
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
Aug 16 at 15:42
add a comment |
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.
4
I strongly disagree with your advice. C is about how and C++ is about what. That's why you haveauto
: 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 whethernetwork_connection
is a class convertible tobool
or a pointer. The code in C++ should express intent from the programmer.
– Mirko
Aug 16 at 19:49
@Mirko: Even if you're interested in "what", then "not x" is still often kind of confusing.
– einpoklum
Aug 16 at 21:10
add a comment |
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.
4
I strongly disagree with your advice. C is about how and C++ is about what. That's why you haveauto
: 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 whethernetwork_connection
is a class convertible tobool
or a pointer. The code in C++ should express intent from the programmer.
– Mirko
Aug 16 at 19:49
@Mirko: Even if you're interested in "what", then "not x" is still often kind of confusing.
– einpoklum
Aug 16 at 21:10
add a comment |
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.
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.
edited Aug 16 at 16:50
answered Aug 16 at 16:44
einpoklumeinpoklum
42.6k28 gold badges149 silver badges294 bronze badges
42.6k28 gold badges149 silver badges294 bronze badges
4
I strongly disagree with your advice. C is about how and C++ is about what. That's why you haveauto
: 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 whethernetwork_connection
is a class convertible tobool
or a pointer. The code in C++ should express intent from the programmer.
– Mirko
Aug 16 at 19:49
@Mirko: Even if you're interested in "what", then "not x" is still often kind of confusing.
– einpoklum
Aug 16 at 21:10
add a comment |
4
I strongly disagree with your advice. C is about how and C++ is about what. That's why you haveauto
: 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 whethernetwork_connection
is a class convertible tobool
or a pointer. The code in C++ should express intent from the programmer.
– Mirko
Aug 16 at 19:49
@Mirko: Even if you're interested in "what", then "not x" is still often kind of confusing.
– einpoklum
Aug 16 at 21:10
4
4
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
Aug 16 at 19:49
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
Aug 16 at 19:49
@Mirko: Even if you're interested in "what", then "not x" is still often kind of confusing.
– einpoklum
Aug 16 at 21:10
@Mirko: Even if you're interested in "what", then "not x" is still often kind of confusing.
– einpoklum
Aug 16 at 21:10
add a comment |
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.
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
stackoverflow.com/a/177007/8038186
– KorelK
Aug 16 at 15:22
5
Huh, true, cppreference doesn't say it. At least not directly.
– Lightness Races in Orbit
Aug 16 at 15:28
2
"is nullptr consistently false?" - Yes.
– Jesper Juhl
Aug 16 at 15:38
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
Aug 16 at 16:14
@bolov: So just suggest the change there, no need to discuss it here...
– einpoklum
yesterday