我正在查看以下代码:
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?
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.
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |