JDR*_*JDR 7 c++ function-pointers function
以下代码段:
#include <iostream>
void does() { std::cout << "do" << std::endl; }
void does(bool b = false) { std::cout << "do(bool)" << std::endl; }
void fwd(void (*func)(bool))
{
func(false);
}
int main(int, char**)
{
fwd(&does);
fwd(does);
fwd(*does);
}
Run Code Online (Sandbox Code Playgroud)
可以理解地产生以下错误:
test.cpp:15:10: error: overloaded function with no contextual type information
编译器无法识别我打算使用哪些函数.我不明白的是当我注释掉以下行时代码将正确运行的原因:
fwd(*does)
为什么编译器会突然解决模糊性?
int main(int, char**)
{
fwd(&does);
fwd(does);
}
Run Code Online (Sandbox Code Playgroud)
此外,没有重载does,代码片段将正确运行所有3个调用.这个片段运行良好......
#include <iostream>
void does(bool b = false) { std::cout << "do(bool)" << std::endl; }
void fwd(void (*func)(bool))
{
func(false);
}
int main(int, char**)
{
fwd(&does);
fwd(does);
fwd(*does);
}
Run Code Online (Sandbox Code Playgroud)
我正在Linux机器上用gcc 4.6.3编译它.
谢谢您的帮助!
您的问题的答案在于函数的重载决策规则.
具体来说,&在函数名称之前使用(一次)不会破坏重载解析,但没有使用的例外*.
另请注意,这两个函数中只有一个接受该单个参数:
13.4重载功能的地址
[over.over]1在没有参数的情况下使用重载函数名称会在某些上下文中解析为函数,指向函数的指针或指向过载集中特定函数的成员函数的指针.函数模板名称被认为是在这种上下文中命名一组重载函数.选择的函数是其类型与上下文中所需的目标类型的函数类型相同的函数. [注意:也就是说,当匹配指向成员函数的指针类型时,忽略函数所属的类.- 尾注]目标可以
- 正在初始化的对象或引用(8.5,8.5.3),
- 任务的左侧(5.17),
- 函数的参数(5.2.2),
- 用户定义的运算符的参数(13.5),
- 函数,运算符函数或转换的返回值(6.6.3),
- 显式类型转换(5.2.3,5.2.9,5.4),或
- 非类型模板参数(14.3.2).
重载的函数名称可以在
&运算符之前.除了列出的上下文之外的上下文中,不应使用重载函数名称.
引用来自n3242(c ++ 11),由我大胆.