【问题标题】:Difficulty in understanding function-pointers in c++难以理解 C++ 中的函数指针
【发布时间】:2018-02-14 11:09:37
【问题描述】:

我正在阅读 Bjarne Stroustrup 的《C++ 编程语言》。它在某处使用 using 关键字来制作函数指针数据类型 P1 和 P2,如下所示:

using P1 = int(∗)(int∗);

using P2 = void(∗)(void);

然后它使用 using 关键字来创建另一个函数指针数据类型:

using CFT = int(const void∗, const void∗);             -(1)

然后它使用 CFT 声明一个函数指针并将其传递给一些 ssort 函数:

void ssort(void∗ base, siz e_t n, size_t sz, CFT cmp);

我的问题是,如果它使用“使用”来制作函数指针数据类型,那么 line-(1) 不应该是:

using CFT=int(*)(const void*, const void*); 

而不是它实际上是什么?

【问题讨论】:

  • 哪个版本?如果他们在那里提到,你检查勘误表了吗?
  • 第 4 版。没有检查,会检查。
  • @Default: 书中的勘误在哪里?
  • @Birbal:书中没有。如果他们在出版这本书时就知道错误,他们就不会犯了。 Google“c++ 编程语言第 4 版勘误表”.
  • 另见this 答案。这可能会有所帮助

标签: c++ function-pointers


【解决方案1】:

在 C 和 C++ 中,(*) 在此处是可选的。

是的,这令人困惑。函数指针类型很奇怪。

如果作者坚持两种可能的语法中的一个会更好。

【讨论】:

  • 正在寻找标准报价,但实际上找不到。我认为类型不同,但最终使用相同。
  • 它们不一样。似乎在函数参数的上下文中是相同的。 godbolt.org/g/EhVV5Z
  • 所以我刚才说的:)
  • 是的。这非常令人困惑。如果F 是函数类型,void call(F f) 和 void call2(F* f) 具有相同的签名。
  • 确实是一个独特且不完整的function type。它有它的用途和古怪之处。我个人喜欢可以使用原始的CFT 来明确指针语义,即CFT*。更不用说可以将它与std::function 一起使用,正如您已经提到的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 2011-01-08
  • 2020-06-05
  • 1970-01-01
  • 2018-06-29
相关资源
最近更新 更多