16

摘要: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?
4

4 回答 4

30

因为这正是 的主要思想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?”。

语法 - “糖”:

int* a = nullptr;
if (a) {
}

这看起来比:

if (a == nullptr) {
}
于 2012-10-26T18:20:02.707 回答
18

在标准的 §4.1 中,它说明了如何执行转换:

标准转换是具有内置含义的隐式转换。第 4 条列举了所有此类转换。标准转换序列是按以下顺序的标准转换序列:

— 从以下集合中进行零次或一次转换:左值到右值的转换、数组到指针的转换和函数到指针的转换。

— 来自以下集合的零个或一个转换:整数提升、浮点提升、整数转换、浮点转换、浮点整数转换、指针转换、指向成员的指针转换和布尔转换。

— 零次或一次资格转换。

因此,编译器只对上述每种类型的转换中的一些、无或全部进行“零或一次转换”,而不是任意多。这真是一件好事

于 2012-10-26T18:21:42.520 回答
2

要了解为什么会发生这种情况,您应该了解如何使用nullptr. 检查以下链接:

我希望它有所帮助。

于 2012-10-26T18:34:50.223 回答
0

在 c++11 中引入了keyworkd nullptr ,因为 C NULL的多个定义,并且在使用 int 参数和 NULL 重载函数时会混淆。

#define NULL 0
#define NULL (void*)0

在圣经中 C++ 编程语言(第 4 期),第 270 页

指针到布尔值的转换在条件下很有用,但在其他地方会令人困惑。

所以我认为 nullptr_t 变量转换为 int 是不允许的,因为这就是它存在的原因,但它可以像 bool 变量一样用作测试条件。

于 2014-05-25T03:24:06.317 回答