2010-10-27 78 views
4

C++ 03 $ 4.10-“空 指针恒定的指针 CV-限定类型的转化是一个单一的 转换,接着是一个指针 转换不是序列 资格转换(4.4)“。NULL指针转换

这是我的理解

int main(){ 
    char buf[] = "Hello"; 
    char const *p1 = buf; // 2 step conversion process 
          // C1: char [6] to char * 
          // C2: char * to char const * (qualification conversion) 

    char const *p2 = 0; // $4.10 applies here 
} 

是我的理解(如代码中的注释)是否正确?

我的问题是

  1. 是什么样的,它值得一提的$ 4.10引述部分,显著? 这并不是说伤害到了那里,但是我认为我不理解它。

  2. 这个引用的含义是什么(重载分辨率?)?任何例子?

+0

$ 4.10便宜。 – dreamlax 2010-10-27 06:19:48

回答

3

你的理解是正确的。

而你的两个问题的答案确实是超载分辨率。过载分辨率必须比较不同的转换序列,才能找到最佳的转换序列,从而选择最佳的可行功能。当比较标准转换序列时,其中一个规则(在13.3.3.2/3中描述)是,如果一个序列是另一个序列的适当子序列,则较短序列比较长序列更好。

例如,如果“空指针常数到CQ-合格空指针值”的转换是一个两步过程,然后该转换将被视为更糟不是“空指针常数以non-cq-qualified null-pointer-value“按照上述规则转换。这看起来不合逻辑,至少对我而言。我更愿意看到这个代码失败

void foo(int *); 
void foo(const int *); 
... 
foo(0); 

由于歧义而不是悄悄地解析为foo(int *)。而且它确实失败了,正如规范所要求的那样。

+0

既然它是一个“const int *”的单步转换过程,那么它不应该调用第二个过载而不是第一个?为什么含糊不清? – Chubsdad 2010-10-27 06:17:25

+0

我认为模糊是因为'o'的类型是int。需要隐式转换将整数0转换为NULL指针常量0以匹配两个重载(因此都是CONVERSION等级)。质量认证转换是否真的出现在这里? – Chubsdad 2010-10-27 06:24:05

+1

@Chubsdad:呃..没有.C++语言没有从int类型到指针类型的隐式转换。在这种情况下,文字'0'以特殊方式处理 - 作为空指针常量。在这种情况下,类型'int'永远不会起作用。 – AnT 2010-10-27 06:51:20