将nullptr转换为bool

时间:2015-02-16 14:58:56

标签: c++ c++11

在C ++之前的11天里,写作更好的做法被认为是:

if (ptr == NULL)

而不是:

if (!ptr)

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

if (ptr == nullptr)

而不是

if (!ptr)

或者现在是第二次罚款?

5 个答案:

答案 0 :(得分:5)

  

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

我打了一个'[citation-needed]。我怀疑任何现代编译器都会考虑到这一点。


如果您使用该值来表示规范的“缺乏价值”,那么

if (ptr)完全没问题且可能在语义上更正确。

我只希望看到if (ptr != nullptr)如果某人实际上正在使用“null”值进行指针算术,但即使这样,它也非常粗略。


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

答案 1 :(得分:4)

unique_ptrshared_ptr等智能指针对bool进行隐式转换,检查内部指针与nullptr,因此在这些情况下第二个是首选,因为意图很清楚。

对于原始指针,我不知道是否有任何实际指导,但ptr != nullptr肯定更清楚地解释了意图(以及涉及的类型)。

答案 2 :(得分:1)

这是一个可读性问题,因为编译器是先进的,以便在两种情况下都能得到最佳处理。一个例外是,如果您创建自己的指针类,其中!ptr必须由您的代码进行评估,并且突然两个语法不一定是等价的。所以我建议在编写通用代码时使用if (ptr != nullptr)语法。

答案 3 :(得分:1)

RE

  

在C ++之前的11天里,写作被认为是更好的做法:

if (ptr == NULL)
     

而不是:

if (!ptr)

不,不是知情人士。

  

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

不,这两个表达式是等价的,一个不是比另一个更有效。而“演员”是符号。将它与执行效率混淆是毫无意义的。

  

并且无法保证宏NULL确实会评估为布尔值false。

确实有这样的保证。

  

在C ++ 11中是否仍然如此?

在C ++ 11和C ++ 14中,它仍然是假的,在C ++ 17中仍然是假的。

答案 4 :(得分:1)

在C中,因为这里有很多人说你是否隐含地转换为bool或明确地与NULL进行比较,这确实只是风格问题。

在C ++ 11中,故事却不同。 nullptr提供类型安全性。请考虑以下示例:

auto ptr = accessVal();
if (ptr == nullptr) {cout << "Pointer is null."};

VS

auto ptr = accessVal();
if (!ptr) {cout << "Pointer is null."};

如果ptr是一个指针,第一个只会编译。如果ptr可以隐式地转换为bool,则第二个将编译。

总结隐式转换为bool的优点是简洁。与nullptr进行比较的优点是类型安全。我认为在大多数情况下,如果类型安全超过简洁的好处,那么这样做会带来好处。实际上,这是首先在C ++ 11中引入nullptr的主要原因。