重载指向函数的指针

oct*_*ian 3 c++

我正在查看以下代码:

string toUpper(string s) {
    string result;
    int (*toupperp)(int) = &toupper; // toupper is overloaded
    transform(begin(s), end(s), back_inserter(result), toupperp);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

我被这条线弄糊涂了:

int (*toupperp)(int) = &toupper; // toupper is overloaded
Run Code Online (Sandbox Code Playgroud)

为什么这条线路必要?

我相信&从内存中检索指向某事物的指针.但是toupper,函数的名称已经是一个指针,不是吗?为什么我们不能这样做:

int (*toupperp)(int) = toupper;
Run Code Online (Sandbox Code Playgroud)

3. int如果函数被重载,为什么它被重载string

krz*_*zaq 5

1)真的没有必要.如果你已经使用了using namespace std指令,那么必须转换为所需的类型,让编译器知道你想要的重载.所以,你也可以说

transform(begin(s), end(s), back_inserter(result), static_cast<int(*)(int)>(&toupper));
Run Code Online (Sandbox Code Playgroud)

否则以下内容应该足够了:

transform(begin(s), end(s), back_inserter(result), ::toupper);
Run Code Online (Sandbox Code Playgroud)

2)作为函数名称的标识符会衰减为指针,是的,但它们并不完全相同.话虽这么说,在这种情况下应该没问题

int (*toupperp)(int) = toupper;
Run Code Online (Sandbox Code Playgroud)

甚至(如果你没有使用using namespace std指令):

auto toupperp = toupper; 
Run Code Online (Sandbox Code Playgroud)

3)它与C标准库的兼容性.它用于每个元素s,它string是一个char.