代码之家  ›  专栏  ›  技术社区  ›  xmh0511

指针类型的标识转换在排名时是否被视为资格转换

  •  0
  • xmh0511  · 技术社区  · 5 年前
    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]之间的模糊性。

    有关规则如下:

    over.ics.rank#3.2.1

    身份转换序列被认为是任何非身份转换序列的子序列 )或者,如果不是那样的话

    国际海事组织, S1 属于 #1 S2 #2 有一个资格转换,上面的规则似乎是这样说的 Identity conversion

    然而,与此案例相对应的另一个相关规则是:
    over.ics.rank#3.2.5

    S1和S2仅在其资格转换([conv.qual])方面不同,并分别产生类似类型T1和T2,其中T1可通过资格转换转换转换为T2。

    依我看,这条规则似乎是这样说的 S1 S2 所有人都有一个 但是,这些转换是不同的,也是不同的 T1 可以转换为 T2 通过资格转换。

    在我的例子中,来自 int* int const* 这绝对是一个错误 资格转换 . 但是,边缘案例来自 int* int* ,此转换是否被视为身份转换或资格转换?根据 conv.qual#3 身份转换 .

    问题1:

    我对[over.ics.rank#3.2.5]规则的理解正确吗?或者,这是不是意味着, 可能有一个空的转换(例如身份转换),当 T1 可以转换为 T2

    问题2:

    指针类型的标识转换是作为限定转换还是仅作为标识转换?换句话说,是[over.ics.rank#3.2.1]还是[over.ics.rank#3.2.5]适用于我的示例?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Brian Bi    5 年前

    来自的标准转换序列 int* 包含资格转换。

    也可以从其他段落推断。例如,请参见[over.best.ics.general]/1:

    隐式转换序列是用于将函数调用中的参数转换为被调用函数的相应参数类型的转换序列。

    和[over.ics.best.general]/6:


    也就是说,正确的隐式转换序列 int* int* int* 副本是从中初始化的吗 int* . 在这种情况下,[dcl.init.general]/16.9适用于:

    否则,要初始化的对象的初始值就是初始值设定项表达式的(可能已转换)值。 如果转换无法完成,则初始化格式错误。

    不允许转换 必需的 int* int* 已经是相同的类型,因此没有进行转换。这不是一种资格转换 int*

    这意味着[over.ics.rank]/3.2.1肯定是决定性的: S1 是身份转换序列(不是由冗余资格转换组成的隐式转换序列),因此它是 S2