摘要:nullptr
转换为bool
,bool
转换为int
,那么为什么nullptr
无法转换为int
?
此代码没问题:
void f(bool);
f(nullptr); // fine, nullptr converts to bool
这没关系:
bool b;
int i(b); // fine, bool converts to int
那为什么不行呢?
void f(int);
f(nullptr); // why not convert nullptr to bool, then bool to int?
答案 0 :(得分:29)
因为它正是nullptr
的主要思想。
nullptr
旨在避免此行为:
struct myclass {};
void f(myclass* a) { std::cout << "myclass\n"; }
void f(int a) { std::cout << "int\n"; }
// ...
f(NULL); // calls void f(int)
如果nullptr
可转换为int
,则会发生此行为。
所以问题是“为什么它可以转换为 bool
?”。
Syntax- “suggarness”:
int* a = nullptr;
if (a) {
}
看起来好于:
if (a == nullptr) {
}
答案 1 :(得分:18)
在标准的第4.1节中,它说明了如何进行转换:
标准转化是具有内置含义的隐式转化。第4条列举了全套此类转换。标准转换序列是按以下顺序的一系列标准转换:
- 来自以下集合的零或一次转换:左值到右值的转换,数组到指针的转换以及函数到指针的转换。
- 来自以下设置的零次或一次转换:整数促销,浮点促销,积分转换,浮点转换,浮点积分转换,指针转换,指向成员转换的指针以及布尔转换。
- 零或一个资格转换。
因此编译器只对上述每种类型的转换中的某些,无或全部进行“零或一次转换”,而不是任意多次。这是非常好的事情。
答案 2 :(得分:2)
要了解为什么会发生这种情况,您应该了解如何使用nullptr
。请查看以下链接:
我希望它有所帮助。
答案 3 :(得分:0)
keyworkd nullptr 是在c ++ 11中引入的,因为C NULL 的多个定义,并且在使用int参数和NULL重载函数时会混淆。
#define NULL 0
#define NULL (void*)0
在圣经“C ++编程语言”(第4版),第270页
指向bool的转换在条件中很有用,但在其他地方却很混乱。
所以我认为不允许将nullptr_t varible转换为int,因为这就是它存在的原因,但它可以用作bool变量之类的测试条件。