【问题标题】:What is the proper term for non-function-pointers in C++?C++ 中非函数指针的正确术语是什么?
【发布时间】:2011-08-17 02:06:47
【问题描述】:

在 C++ 中,您可以传入“函数类型”,它们类似于函数指针,但它们只是函数的类型,而不是指向它的指针。例如:

template< typename T >
class MyTemplateClass
{
   // ...
};

// ... and later...

MyTemplateClass<void (int, int)> mtc;

这个表格的正确名称是什么?这是“函数类型”吗?

更新:

我编辑了我的示例,使其更加清晰。但是,请记住我要指出的示例的主要部分是 void (int, int) 部分。

【问题讨论】:

  • 类是做什么的?如果它只是一个函数的类型,也许你可以称它为“函数类”?因为您正在定义一个特定类型函数的类。我只是在这里发明新词:P
  • 类型的正确名称是什么?无论是函数、对象、积分、指针,还是我认为仍然类型的任何东西。
  • 丑。不要打我。但这真的有效吗?在标准中,我看到您可以使用“typename”。这似乎是唯一的语法选择,因为“类”和“模板”显然不起作用。 void(int, int) 只是类型名的疯狂速记吗?这是什么编译器?再一次......随意给我上学。我意识到我以前从未见过这种情况。
  • 是的,它基本上是一个函数。大多数人将其键入为某事。 void(int, int) 是一个函数类型,它接受两个 int 并返回一个 void。更常见的是:typedef void (&amp;func_vii)(int,int); MyTemplateClass&lt;func_vii localfunc&gt; {...
  • @Michael: void(int,int) 是函数类型的规范:接受两个 int 参数并且没有返回值的函数的类型。在这种情况下,它被用作带有类型参数的模板的参数,可能在某处声明为template &lt;typename Function&gt; class MyTemplateClass;

标签: c++ templates


【解决方案1】:

是的,术语是“函数类型”。

【讨论】:

  • 不是我认为这不是一个好名字,而是函数类型不是指类型的名称和它的定义吗?可能是我太挑剔了。 (我可能太挑剔了)。
  • @Michael:完全挑剔,void(int,int) 是函数类型的类型说明符。只有用户定义的类型(不包括函数类型)才有名称和定义。
【解决方案2】:

是的,这是一个“函数类型”

8.3.5[dcl.fct] 说

  1. 在声明 T D 中,其中 D 的形式为 D1 ( parameter-declaration-clause ) cv-qualifier-seqopt ref-qualifieropt exception-specificationopt attribute-specifier-seq选择 [...]
  2. 在声明 T D 中,其中 D 的形式为 D1 ( parameter-declaration-clause ) cv-qualifier-seqopt ref-qualifieropt exception-specificationoptattribute-specifier-seq选择 trailing-return-type [...]
  3. 任何一种形式的类型都是函数类型

【讨论】:

  • 我对@Mike 发表了评论,相信我,现在这只是好奇,但在 8.3.5 中,它涉及到类型的名称和完整的定义。 8.3.5 中的“函数类型”在模板参数中是不可接受的语法。
  • @Michael Hays 是的,它不能作为模板参数接受,这就是 template&lt;typename Func&gt; 的所在。作为模板参数是可以接受的。 14.3[temp.arg]/2 有一个很好的例子,f&lt;int()&gt;();
【解决方案3】:

它们与函数指针的区别只是语法有点相似;否则它们与函数指针无关(即它们不保存任何数据或任何类似的东西)。但是,David Rodriguez 在下面指出,它们可能被认为是相关的,就像 intint* 相关。

无论如何,它们只是类型,例如 int(不是 an int,只是 int)。

【讨论】:

  • 我不会说它们与函数指针无关:它们与函数指针相关,就像int 与 int 指针 int* 相关一样。跨度>
猜你喜欢
  • 2011-03-17
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
相关资源
最近更新 更多