【问题标题】:Assigned `nullptr` to `bool` type. Which compiler is correct?将 `nullptr` 分配给 `bool` 类型。哪个编译器是正确的?
【发布时间】:2018-03-30 15:51:35
【问题描述】:

我有一个将nullptr 分配给bool 类型的代码的以下sn-p。

#include <iostream>

int main()
{
    bool b = nullptr;
    std::cout << b;
}

clang 3.8.0 中工作正常。它给出了一个输出0Clang Demo

但是g++ 5.4.0报错:

source_file.cpp: In function ‘int main()’:
source_file.cpp:5:18: error: converting to ‘bool’ from ‘std::nullptr_t’ requires direct-initialization [-fpermissive]
         bool b = nullptr;

哪个编译器是正确的?

【问题讨论】:

  • 我在您链接的实时编译器中运行它时收到编译器警告。 “警告:将 nullptr 常量隐式转换为 'bool' [-Wnull-conversion]”
  • 根据 GCC(和 MSVC)给出的错误以及reference 中的部分,我想说标准不允许(并且 Clang 允许它作为扩展名)跨度>
  • 这该死的不应该。 nullptr 的全部要点之一是使在布尔上下文中使用指针成为一项明确定义的事情。 :-/ 但是,我可以看到至少以这样的赋值形式警告直接转换可能是正确的。当你有nullptr &amp;&amp; true 而不是nullptr 时,编译器是否仍然报错?
  • 有没有人确认过在 Linux 机器上接受 nullptr 的 boolean 的 clang 版本?尽管如果 Linux 机器上存在这样的情况,我不会感到惊讶。我在那里看到了奇怪的东西。
  • @VG Clang 3.8 gives a warning 在 Linux 上,即使没有任何 -W 选项。

标签: c++ gcc boolean clang nullptr


【解决方案1】:

来自 C++ 标准(4.12 布尔转换)

1 算术、无范围枚举、指针或指针的纯右值 to 成员类型可以转换为 bool 类型的纯右值。一个零 值、空指针值或空成员指针值被转换 为假;任何其他值都将转换为 true。 为 直接初始化 (8.5),std::nullptr_t 类型的纯右值可以是 转换为 bool 类型的纯右值;结果值为假。

所以这个声明

bool b( nullptr );

有效并且这个

bool b = nullptr;

错了。

我本人已经在isocpp指出了这个问题

【讨论】:

  • C++11 标准有不同的措辞。见timsong-cpp.github.io/cppwp/n3337/conv.bool。您帖子中的文字是否来自标准的更高版本?
  • 尽管如此,为什么它在 OP 所述的 clang 3.8.0 上运行良好?它是否将nullptr 解释为clang 中的0? (虽然可能性较小)
  • 是不是少了一点?我认为应该是“所以这个声明是正确的”(对于第一个 sn-p)
  • @RSahu 似乎后来被报告为缺陷:open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#1423
  • @Slava 由于互联网问题,我的帖子中有错字。:)
【解决方案2】:

这已被DR 1423 更改,因此没有从nullptrbool 的隐式转换。

(最近DR 1781DR 2133 再次更改了相关措辞,但只是为了移动措辞,而不是更改有效的转换。在撰写本文时,CWG 问题列表并未显示 1781 已已解决,但草稿的更改位于visible in git。)

所以在我看来,Clang 3.8 实现了 pre-1423 规则,而 GCC 5.4 实现了不允许从 nullptr 隐式转换到 bool 的 post-1423 规则。

当前版本的 Clang 仍然允许转换,但会发出 -Wnull-conversion 警告。

【讨论】:

    猜你喜欢
    • 2016-03-30
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2020-08-23
    • 2021-04-07
    • 1970-01-01
    相关资源
    最近更新 更多