【问题标题】:C++ function match priority [duplicate]C ++函数匹配优先级[重复]
【发布时间】:2015-04-30 07:02:32
【问题描述】:

我有一个关于 c++ 函数匹配优先级的简单问题。假设我有这样的代码:

#include <iostream>

void func(const char*)
{
    std::cout << "const char*" << std::endl;
}

template<int N>
void func(const char (&) [N])
{
    std::cout << "const char (&) [N]" << std::endl;
}

int main(int argc, char* argv[])
{
    func("Hello world");
    return 0;
}

代码的结果是(带Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)):

const char*

我认为"Hello world" 的字面量类型应该是const char[]。为什么const char* 版本的优先级高于const char (&amp;)[] 版本?

【问题讨论】:

    标签: c++ function


    【解决方案1】:

    重载分辨率尝试找到最佳转换。以下段落列出了可以区分两种转换的相关要点:

    标准转换序列S1 是比标准转换序列更好的转换序列 标准转换序列S2if

    • S1S2 的适当子序列(比较由 13.3.3.1.1 定义的规范形式的转换序列,不包括任何 左值变换;考虑恒等转换序列 是任何非恒等式转换序列的子序列),或者,如果 不是这样的,

    • S1 的排名优于S2 的排名,或者S1S2 的排名相同,可以通过 以下段落中的规则,或者,如果不是,则

    • […]

    虽然函数模板的特化产生了一个带有恒等转换的参数,但char const* 的非模板重载需要数组到指针的转换。直觉上,我们会说前者是更好的匹配,因此应该被选中。但是,数组到指针的转换是左值转换,不包括在第一个要点中。由于它具有精确匹配排名,因此转换排名与char const (&amp;)[N] 的转换排名没有区别,char const (&amp;)[N] 也具有精确匹配排名。 “以下段落中的规则”也无法区分转换,因为它们仅解决派生到基础的转换等,而不是数组到指针。

    事实上,转换为char const (&amp;)[N] 并没有更好的办法。但重载决议区分模板:

    鉴于这些定义,一个可行的函数F1 被定义为 如果所有参数都比另一个可行的函数F2 更好的函数 i,ICSi(F1)不是比ICS更差的转换序列i(F2),然后

    • 对于某些参数 j,ICSj(F1) 是更好的转换 序列比 ICSj(F2),或者,如果不是,

    • […]

    • F1 不是函数模板特化,F2 是函数 模板专业化,或者,如果不是,则

    因此选择了非模板重载。

    【讨论】:

    • 简而言之:const char *const char (&amp;) [N] 都会使 Exact Match Rankconst char (&amp;) [N] 丢失,因为模板专业化。
    • 你能解释一下,什么是左值变换吗?
    • 大声笑,我将把这个问题作为另一个完全相同的问题的副本来结束,你也回答了这个问题。
    • @Barry 我完全错过了。干得好。
    • @Columbo 干得好 - 这是一个很好的答案。在这两个地方。
    【解决方案2】:

    在您的特定情况下,应用的解析规则的相关部分是非模板函数优先于模板函数,这就是您看到指针而不是数组引用的原因。

    【讨论】:

    • 它比这复杂得多,以至于 25 多页的标准专门用于解决重载问题(不,我没有对此投反对票)。
    • @WhozCraig - 但在主题案例中,这 25 多页的相关部分正是我在回答中给出的。每个人都可以引用标准,但不是每个人都能给出具体的答案。希望投反对票的人玩得开心。
    • 我至少部分同意,因此我否决了你的答案。
    猜你喜欢
    • 1970-01-01
    • 2013-03-16
    • 2010-09-28
    • 2023-04-09
    • 1970-01-01
    • 2017-08-23
    • 2019-12-01
    • 2017-05-21
    • 2021-08-10
    相关资源
    最近更新 更多