我的理解是,nullptr不能隐式转换为其他类型。但后来,我“发现”它可以转换成bool。问题是,我可以看到它在GCC 4.x上被转换成bool,但它抱怨GCC > 5.X
#include <iostream>
bool f(bool a){
return !a;
}
// Type your code here, or load an example.
int main() {
return f(nullptr);
}在>5.x上我得到
<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
有人能解释一下为什么不同的版本和在这里应用什么规则。
发布于 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作为空指针常量使用的黑客,并无意中匹配其他模板或重载。
守则可以是:
return f(static_cast<bool>(nullptr));或者您可以添加一个接受f的过载的std::nullptr_t。
https://stackoverflow.com/questions/51663435
复制相似问题