我有以下代码段,分配nullptr
到bool
类型。
#include <iostream>
int main()
{
bool b = nullptr;
std::cout << b;
}
clang 3.8.0 正常工作。它给出了输出0
。 Clang 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;
哪个编译器正确?
答案 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更改,因此没有从nullptr
到bool
的隐式转换。
(相关措词最近又由DR 1781和DR 2133进行了更改,但仅是为了移动措辞,而不更改有效的转换。在撰写本文时,CWG问题列表并未更改表示1781年已解决,但草稿的更改位于visible in git。)
在我看来,Clang 3.8实现了1423年之前的规则,而GCC 5.4实现了1423年之后的规则,该规则不允许从nullptr
到bool
的隐式转换。
当前的Clang版本仍允许进行转换,但会发出-Wnull-conversion
警告。