首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指定“`nullptr`”为“`bool`”类型。哪个编译器是正确的?

指定“`nullptr`”为“`bool`”类型。哪个编译器是正确的?
EN

Stack Overflow用户
提问于 2017-10-18 17:20:56
回答 2查看 1.6K关注 0票数 7

下面有一个将nullptr分配给bool类型的代码片段。

代码语言:javascript
复制
#include <iostream>

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

中clang3.8.0工作良好。它给出了输出0Clang演示

但是g++ 5.4.0给出了一个错误:

代码语言:javascript
复制
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;

哪个编译器是正确的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-18 17:29:15

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

1算术、非作用域枚举、指针或成员类型指针的prvalue可转换为bool类型的prvalue。零值、空指针值或空成员指针值转换为false;任何其他值都转换为真。用于直接初始化(8.5),可以将std::nullptr_t类型的prvalue转换为bool类型的prvalue;结果值为false。

所以这个声明

代码语言:javascript
复制
bool b( nullptr );

是有效的

代码语言:javascript
复制
bool b = nullptr;

是错的。

我自己已经在异翻上指出了这个问题

票数 12
EN

Stack Overflow用户

发布于 2019-02-15 12:45:38

这是由博士1423更改的,因此不存在从nullptrbool的隐式转换。

( 博士1781博士2133最近再次修改了相关的措辞,但只是为了移动措辞,而不是更改哪些转换是有效的。在撰写本报告时,CWG的问题清单并没有显示1781年已经解决了,但是对草案的修改是在可见于git)。

在我看来,Clang3.8实现了1423年前的规则,GCC 5.4实现了1423年后的规则,不允许从nullptrbool的隐式转换。

当前版本的Clang仍然允许转换,但是给出一个-Wnull-conversion警告。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46815821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档