【问题标题】:How do static and const resolve ambigous function calls?static 和 const 如何解决模棱两可的函数调用?
【发布时间】:2019-08-19 01:33:23
【问题描述】:

我目前正在尝试理解函数调用的概念,并注意到您可以编写糟糕的代码,但仍然可以通过滥用隐式转换、const 和 static 使其工作。

现在我想了解为什么,尤其是它是如何工作的。例如下面是我用于测试的代码 sn-p。

标有 (1) 的行需要 a_const 要求它是 const 修饰符,并且有一个 static 函数需要或多或少适当的参数。删除这两个中的任何一个都会导致编译错误。那么这是如何工作的呢?

#include <iostream>

struct A {

static void func(const int a, int b) {
    std::cout << "A-1"<<std::endl;
}
void func(const int a, float b) {
    std::cout << "A0"<<std::endl;
}
void func(double a, float b) {
    std::cout << "A1"<<std::endl;
}
void func(unsigned int a, char b) {
    std::cout << "A2"<<std::endl;
}
void func(float a, int b) {
    std::cout << "A3"<<std::endl;
}
};

int main() {
const A a_const;
A a;
a_const.func(1.f,1.f); // (1)
// a.func(1.f,1.f);    // (2)
return 0;
}

【问题讨论】:

  • 您应该深入了解 C++ 标准的 16.3.3 Best viable function [over.match.best] 部分。这真是一个乱七八糟的话题。
  • @VTT,我知道这个话题很乱,虽然不知道要找什么。然而,我发现终于到了让自己沉浸其中并希望变得更有知识的时候了。

标签: c++ static constants implicit-conversion function-call


【解决方案1】:
a.func(1.f,1.f);

这是一个模棱两可的调用,因为所有 A::func 匹配,没有一个比另一个更好。


a_const.func(1.f,1.f);

不是一个模棱两可的调用,因为 a_constconst 限定的,所有非 const A::func 都不匹配。重载集只剩下static 成员函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多