将`nullptr`分配给`bool`类型。哪个编译器正确?

时间:2017-10-18 17:20:57

标签: c++ gcc boolean clang nullptr

我有以下代码段,分配nullptrbool类型。

#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;

哪个编译器正确?

2 个答案:

答案 0 :(得分:10)

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

  

1算术,无范围枚举,指针或指针的prvalue   成员类型可以转换为bool类型的prvalue。零   转换value,null指针值或null成员指针值   为假;任何其他值都转换为true。 :用于   直接初始化(8.5),类型为std :: nullptr_t的prvalue可以   转换为bool类型的prvalue;结果值为false。

所以这个宣言

bool b( nullptr );

有效且

bool b = nullptr;

错了。

我自己在isocpp

指出了这个问题

答案 1 :(得分:0)

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

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

在我看来,Clang 3.8实现了1423年之前的规则,而GCC 5.4实现了1423年之后的规则,该规则不允许从nullptrbool的隐式转换。

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