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