NULL指针转换

时间:2010-10-27 05:44:25

标签: c++

  

C ++ 03 $ 4.10-“null的转换   指针常量指向   cv-qualified类型是单一的   转换,而不是a的顺序   指针转换后跟一个   资格转换(4.4)。“

这是我的理解

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. 这句话的含义是什么(重载决议?)?有什么例子吗?

1 个答案:

答案 0 :(得分:3)

您的理解是正确的。

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

例如,如果“null-pointer-constant to cq-qualified null-pointer-value”转换是一个两步过程,则此转换将被视为更糟根据上述规则,将“空指针常量转换为非cq限定空指针值”转换。这看起来不合逻辑,至少对我而言。我更喜欢看到此代码失败

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

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