首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么g++ 4.x允许在作为参数传递时将nullptr隐式转换为另一种类型,但> 5.x不允许?

为什么g++ 4.x允许在作为参数传递时将nullptr隐式转换为另一种类型,但> 5.x不允许?
EN

Stack Overflow用户
提问于 2018-08-02 23:30:57
回答 1查看 81关注 0票数 1

我的理解是,nullptr不能隐式转换为其他类型。但后来,我“发现”它可以转换成bool。问题是,我可以看到它在GCC 4.x上被转换成bool,但它抱怨GCC > 5.X

代码语言:javascript
复制
#include <iostream>
bool f(bool a){
    return !a;
}
// Type your code here, or load an example.
int main() {
    return f(nullptr);
}

在>5.x上我得到

代码语言:javascript
复制
<source>: In function 'int main()':

<source>:7:21: error: converting to 'bool' from 'std::nullptr_t' requires direct-initialization [-fpermissive]
     return f(nullptr);

             ^

<source>:2:6: note:   initializing argument 1 of 'bool f(bool)'
 bool f(bool a){

      ^
Compiler returned: 1

我在GCC 5.X的发行说明中找不到任何可以解释这一点的东西。

可以在这里观察到:https://godbolt.org/g/1Uc2nM

有人能解释一下为什么不同的版本和在这里应用什么规则。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-03 00:04:48

这个规则可以在C++17 can . be /1中找到:

对于直接初始化,可以将std::nullptr_t类型的prvalue转换为bool类型的prvalue;结果值为false。

函数参数的初始化是复制初始化,而不是直接初始化.如果您不熟悉这个主题;C++中的初始化上下文可以分为这两个类,并且有些操作只能在直接初始化中发生。

在C++14中增加了对直接初始化的限制,这可以解释g++版本之间的差异.

我假设这条规则的目的是为您编写的确切代码带来一个错误:需要一个bool,并提供了一个空指针常数;测试一个空指针常量对于布尔性来说没有多大意义,因为它只有一种状态。

请记住,nullptr不是指针;如果代码显式请求这样的转换,则可以将其隐式转换为空指针。添加它的全部原因是修复将0作为空指针常量使用的黑客,并无意中匹配其他模板或重载。

守则可以是:

代码语言:javascript
复制
return f(static_cast<bool>(nullptr));

或者您可以添加一个接受f的过载的std::nullptr_t

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

https://stackoverflow.com/questions/51663435

复制
相关文章

相似问题

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