【发布时间】:2020-12-14 02:11:03
【问题描述】:
void fun(int*); // #1
void fun(int const*); //#2
int main(){
int* ptr = nullptr;
fun(ptr);
}
考虑上面的例子,重载决议应该在#1和#2中选择最好的可行函数。这是this question的一个分支,即[over.ics.rank#3.2.1]和[over.ics.rank#3.2.5]之间的模糊。
相关规则为:
S1是S2的一个真子序列(比较[over.ics.scs]定义的规范形式的转换序列,不包括任何左值变换;恒等转换序列被认为是任何非- 身份转换序列)或者,如果不是那个
IMO,S1 的 #1 有一个身份转换,而 S2 的 #2 有一个资格转换,上面的规则似乎是说Identity conversion 比任何有一个非身份转换更好完全匹配排名。
不过,还有一条相关规则对应本案,即:
over.ics.rank#3.2.5
S1 和 S2 的区别仅在于它们的限定转换 ([conv.qual]) 并分别产生相似的类型 T1 和 T2,其中 T1 可以通过限定转换转换为 T2。
IMO,这条规则似乎说S1 和S2 都有资格转换,但这些转换不同,T1 可以通过资格转换转换为T2。
在我的示例中,从int* 到int const* 绝对是资格转换。但是,一个极端情况是从int* 到int*,这种转换是身份转换还是资格转换?根据conv.qual#3的定义,可以。不过严格来说应该叫身份转换。
问题一:
我对规则 [over.ics.rank#3.2.5] 的理解正确吗?或者,这是否意味着,T1 可以通过资格转换转换为T2 时,S1 可能有一个空转换(例如身份转换)? (包括指针的身份转换)
Q问题2:
指针类型的恒等转换被认为是限定转换还是只是恒等转换?换句话说,[over.ics.rank#3.2.1] 或 [over.ics.rank#3.2.5] 是否适用于我的示例?
【问题讨论】:
标签: c++ language-lawyer