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
}
我的理解(如代码注释中)是否正确?
我的问题是
值得提及的4.10美元的报价部分有多重要? 并不是说在那里很痛,但我认为我不明白。
这句话的含义是什么(重载决议?)?有什么例子吗?
答案 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 *)
。它确实失败了,正如规范所要求的那样。