【问题标题】:Function overloading by function pointer通过函数指针重载函数
【发布时间】:2015-05-22 07:25:45
【问题描述】:

有一个关于重载函数的问题。看这段代码:

#include<iostream>

void fv(int){}
void fc(const int){}
void fvr(int&){}
void fcr(const int&){}

void fm(void(*fun)(const int))
{
    std::cout << "Constant called" << std::endl;
}

//void fm(void(*fun)(int))
//{
//  std::cout << "non Constant called" << std::endl;
//}

void fm(void(*fun)(const int&))
{
    std::cout << "Constant ref called" << std::endl;
}

void fm(void(*fun)(int&))
{
    std::cout << "non Constant ref called" << std::endl;
}

int main()
{
    fm(&fc);
    fm(&fv);
    fm(&fvr);
    fm(&fcr);
    return 0;
}

如果取消注释 void fm(void(*fun)(int)) 函数,您会发现编译器无法通过按值接受参数的函数上的指针和接受 const 值的函数上的指针来静态重载函数。此外,如果您取消注释 void(*fun)(const int) 并注释 void(*fun)(const int),那么所有编译都会成功。但是,如果我们使用引用,它就可以编译。不明白为什么,能解释一下吗?这是否意味着指向按值接受参数和按常量值接受参数的函数的指针是相同的类型?

更新: Top-level const doesn't influence a function signature 有一个很好的解释为什么应该删除顶级 const。

【问题讨论】:

    标签: c++ function-pointers overloading


    【解决方案1】:

    是的,顶级 const 将被删除。来自 gcc 的错误

    重新定义'void fm(void (*)(int))'

    你可以看到 const 被删除了。

    引自 N3376 8.3.5/5

    在生成参数类型列表后,任何顶级 修改参数类型的 cv 限定符在形成 函数类型。

    【讨论】:

    • 为什么它删除了值而不是删除了引用?
    • @brachistochron 只是因为引用中的 const 不是顶级 const。
    • 是的,明白了,谢谢。但仍然不明白为什么它会这样工作 =)
    • 如果比较函数参数T*T const*或者T&amp;T const&amp;,你会发现差别很大。如果你比较TT const,也会有区别,但差别很小,调用者看不到,因此标准只是说它不会产生不同的函数签名。同样,T*T*const 差别不大。请注意,T&amp;T&amp;const 无法比较,因为后者根本不存在。
    【解决方案2】:

    是的,您不能基于非指针/非引用参数的 const 来重载函数,请参阅: Functions with const arguments and Overloading

    这又意味着指向按值接受参数和 const 值的函数的指针是相同的类型。

    【讨论】:

      猜你喜欢
      • 2014-05-30
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      相关资源
      最近更新 更多