【问题标题】:What's going on at tolower? [duplicate]楼下是怎么回事? [复制]
【发布时间】:2018-10-27 15:43:04
【问题描述】:

我正在阅读这个答案:https://stackoverflow.com/a/5539302/588867

这部分发生了什么:(int (*)(int))tolower 在这行代码中:

transform(s.begin(),s.end(),s.begin(),(int (*)(int))tolower );

如果我创建了这个函数并且代码有效:

int myToLower(int c){
    return tolower(c);
}

transform(s.begin(),s.end(),s.begin(), myToLower);

这部分的简单英语是什么:(int (*)(int))

【问题讨论】:

  • 这是一个 C 风格的函数指针转换
  • 这是一个有趣的页面@LưuVĩnhPhúc :)

标签: c++ lambda function-pointers


【解决方案1】:

你可以在my answer 中看到这个答案,这是一个函数指针。你可以在这里阅读更多关于它们的信息:http://en.cppreference.com/w/cpp/language/pointer#Pointers_to_functions

从根本上说,这是一个指向函数的指针,该函数接受 int 参数并返回 int


transform 在使用myToLower 而不是与未转换的tolower 一起使用时起作用的原因是,在代码中tolower 函数在std 命名空间中被语言环境库的@987654323 重载@ 和 ctype 库的 tolower。当仅将函数名用作非强制类型转换指针时,不会执行重载决议,您将收到错误消息。当你转换函数指针时,你是在告诉编译器你想要哪个重载。

【讨论】:

  • 我检查了您提供的 cppreference 页面。我可以理解这一点:void (*p2)(int) = f。但从那个到(int (*)(int))tolower,涉及两个步骤:1. 定义一个匿名函数指针类型(int (*)(int)) 和2. 将tolower 转换为该类型。对吗?
  • 是的,cast 直接表示编译器我们要使用哪个重载函数。我会使用 static_cast 顺便说一句。
猜你喜欢
  • 2021-04-13
  • 2016-03-25
  • 2011-10-13
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多