2012-10-26 46 views
16

总结:nullptr转换为boolbool转换为int,那么为什么不nullptr转换为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? 
+2

您认为转换是什么? –

+3

编译器只会对您传递的内容进行一次*隐式转换,直到函数接受。这适用于基本上所有类型,不只是nullptr的。例如,如果你定义了一个转换为'char'的类型,并且试图将它传递给一个带有'int'的函数,即使它支持隐式转换为'char',它也会失败,并且还有一个从'char'到'int'的隐式转换。 –

+1

@JerryCoffin编译器通常会进行多个隐式转换。根据规则,它只会执行一次用户定义的转换,但它可以处理任何其他转换。有一条规则,最多可以在任何给定的类别中应用一个转换,并且'nullptr_t'到'bool'和'bool'到各种整数类型都在类别“转换”(参见13.2.2.1.1)中。 –

回答

28

因为这正是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) { 
} 
+4

这不是一个答案! –

+9

@大卫:不,是的。 'nullptr'背后的原因是它不*转换为指针类型以外的任何东西。 – Xeo

+2

@David:它是什么? – RiaD

18

在标准的§4.1,它说如何转换进行:

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

- 从以下集合中进行零或一次转换:左值到右值转换,数组到指针转换以及函数至指针转换。

- 零或者选自以下组的一个转换:积分促销,浮点推广,积分转换,浮点转换,浮积分转换,指针转换,指针构件转换,和布尔转换。

- 零个或一个合格的转换。

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

+0

+1:tite回答,塞思。我很难说,但是这里列出的转换类别(三个具体分类)是相互排斥的吗?这个标准对我来说略显灰色(或者我没有正确阅读,这不会是第一次)。 – WhozCraig

+1

@WhozCraig不,他们每一个都是按顺序完成的,无论是一个,一个,两个还是全部三个;包容性。使用aschepler的例子:'void f(const int *); int my_array [10]; f(my_array);'将数组转换为一个指针,然后指向一个'const'指针。 –

+0

好的,那么它们至少会出现在瀑布中,而标准确实表明了这一点(即一旦一个卷宗被填充,就不会返回列表;你只能下去,我想..) – WhozCraig

0

的keyworkd nullptr在C++ 11引入,因为多个定义的C NULL的,和重载用INT参数和NULL的功能时它混淆。

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

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

指针到布尔转换是在条件有用的,但在其他地方混淆。

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

相关问题