为什么无法将nullptr转换为int?

时间:2012-10-26 18:18:10

标签: c++ c++11 implicit-conversion nullptr

摘要:nullptr转换为boolbool转换为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 个答案:

答案 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变量之类的测试条件。