将nullptr转换为bool

Ben*_*ler 4 c++ c++11

在C++之前的11天里,编写更好的做法是:

if (ptr == NULL)
Run Code Online (Sandbox Code Playgroud)

而不是:

if (!ptr)
Run Code Online (Sandbox Code Playgroud)

这有两个原因.它效率更高,因为它不需要强制转换为bool.并且无法保证宏NULL确实会评估为布尔值false.这在C++ 11中仍然如此吗?写作是否更可取

if (ptr == nullptr)
Run Code Online (Sandbox Code Playgroud)

而不是

if (!ptr)
Run Code Online (Sandbox Code Playgroud)

或者现在是第二次罚款?

Bar*_*icz 5

它效率更高,因为它不需要强制转换为bool.

我会打[citation-needed]那个耳光.我怀疑任何现代编译器都能算得上.


if (ptr) 如果您使用该值来表示规范的"缺乏价值",则完全正确并且可能在语义上更正确.

我只希望看到if (ptr != nullptr)有人实际上是否正在使用"null"值进行指针算术,但即使这样,它也是非常粗略的.


话虽这么说,很多时候你可以逃脱...根本没有检查.如果指针的可为空性用于表示可以为空的数据字段,请使用optional.如果你正在初始化它以防它是空的,请使用value_or成语.如果它只是一个弱参考而且价值合约在外面,那么assert就会做.


Che*_*Alf 5

关于

在 C++11 之前的日子里,更好的做法是这样写:

if (ptr == NULL)
Run Code Online (Sandbox Code Playgroud)

而不是:

if (!ptr)
Run Code Online (Sandbox Code Playgroud)

不,不是消息灵通的人说的。

这有两个原因。它更高效,因为它不需要转换为 bool。

不,这两个表达式是等价的,一个并不比另一个更有效。“cast”是一种符号。将其与执行效率混为一谈是没有意义的。

并且不能保证宏 NULL 确实会计算为布尔值 false。

确实有这样的保证。

这在 C++11 中仍然成立吗?

它在 C++11 和 C++14 中仍然都是 false,在 C++17 中仍然是 false。