为什么nullptr不能转换为int?

Kno*_*abe 16 c++ nullptr implicit-conversion c++11

总结:nullptr转换为bool,bool转换为int,为什么不nullptr转换为int

这段代码没问题:

void f(bool);
f(nullptr);      // fine, nullptr converts to bool
Run Code Online (Sandbox Code Playgroud)

这没关系:

bool b;
int i(b);        // fine, bool converts to int
Run Code Online (Sandbox Code Playgroud)

那么为什么这不行呢?

void f(int);
f(nullptr);      // why not convert nullptr to bool, then bool to int?
Run Code Online (Sandbox Code Playgroud)

Mur*_*los 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)
Run Code Online (Sandbox Code Playgroud)

如果nullptr可以转换为int这种行为会发生.

所以问题是" 它为什么可以转换为 bool?".

Syntax- "suggarness":

int* a = nullptr;
if (a) {
}
Run Code Online (Sandbox Code Playgroud)

哪个看起来好于:

if (a == nullptr) {
}
Run Code Online (Sandbox Code Playgroud)

  • @David:不,是的.`nullptr`背后的原因是它*不*转换为指针类型以外的任何东西. (10认同)
  • 那不是答案! (5认同)
  • @SethCarnegie:"为什么不能"的问题很容易回答"因为规范是这么说的".由于这在任何实际意义上都是简单,明显和完全无用的*,因此问题显然是隐含地要求禁止转换的*原因*. (4认同)
  • @David:它是什么? (2认同)
  • @MuriloVasconcelos在你的例子中,`if(a)`将`int*`转换为`bool`,而不是`nullptr`转换为`bool`. (2认同)

Set*_*gie 18

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

标准转化是具有内置含义的隐式转化.第4条列举了全套此类转换.标准转换序列是一系列标准转换,顺序如下:

- 来自以下集合的零或一次转换:左值到右值的转换,数组到指针的转换以及函数到指针的转换.

- 来自以下集合的零或一次转换:整数促销,浮点促销,积分转换,浮点转换,浮点积分转换,指针转换,成员转换指针和布尔转换.

- 零或一个资格转换.

因此,编译器仅对上述每种类型的转换中的某些,无或全部进行"零或一次转换",而不是任意多次.这是一件非常好的事情.