首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >析构函数是否根据标准有名称?

析构函数是否根据标准有名称?
EN

Stack Overflow用户
提问于 2010-04-22 17:55:06
回答 1查看 939关注 0票数 5

按照标准,类析构函数是否有学究意义上的名称?

回想一下,构造函数显式地没有名称:

12.1.1:

构造函数没有名称。使用可选的函数说明符序列(7.1.2)、构造函数的类名和参数列表,使用特殊的声明器语法来声明或定义构造函数。在这样的声明中,构造函数类名周围的可选括号将被忽略。

“标准”没有明确规定析构函数有或没有名称,但是有许多关于如何使用特殊语言引用和声明析构函数的引用,其中没有一个直接引用析构函数的名称。这个问题似乎在许多地方都被回避了:

12.4.1:

使用可选函数说明符(7.1.2)的特殊声明器语法,后面是~,后面是析构函数的类名,后面是空参数列表,用于在类定义中声明析构函数。

5.2.4.1:

在点之后使用伪析构函数名。或箭头->运算符表示按类型名称命名的非类类型的析构函数.结果只能用作函数调用操作符()的操作数,并且这种调用的结果类型为shall。唯一的效果是在点或箭头之前计算后缀表达式。

12.4.12:

在显式析构函数调用中,析构函数名称显示为~,后面跟着命名析构函数类类型的类型名称。对析构函数的调用受成员函数(9.3)通常的规则约束,也就是说,如果对象不是析构函数的类类型,而不是派生自析构函数类类型的类,则程序具有未定义的行为(除了对空指针调用delete没有影响)。

最后一种情况(12.4.12)似乎是对析构函数名称最直接的引用,但它仍然避免说析构函数有名称,而且对此非常矛盾。12.4.12可以解释为"blah是析构函数的名称“或”析构函数没有名称,但您可以将析构函数称为blah“。

那么,析构函数有名字吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-22 18:34:55

首先,我认为标准在“名称”的使用上是矛盾的。首先,它说(在下面添加了其他形式的名称,并经C++0x草案更正)

名称是identifier (2.11)、运算符函数id (13.5)、转换函数id (12.3.2)或模板id (14.2)的用法,它们表示实体或标签(6.6.4、6.1)。

然后,在标准的某些部分中,它使用"name“,就好像它会包含像foo::bar这样的限定符部分。在其他部分,它将这些部分从“名称”中排除在外。有一段甚至说,以::为前缀的名称是指全局名称。但在我们的示例中,bar以这样的标记为前缀,尽管它有意不引用全局名称。

我认为,我们示例中的构造不是名称,而是两个名称,一个限定了另一个。构造~ class-name引用析构函数(参见3.4.5/33.4.3/6)。这种构造由一个~令牌和一个名称组成,引用构造函数的类。传统上称它为析构函数的“名称”(就像3.4.3.1/2上的标准讨论“构造函数名”一样)--但实际上,它不是一个名称。

所以,如果你是脚踏实地的,你会说一个析构函数没有自己的名字,而是使用特殊的机制来引用它。同样,对于构造函数,使用特殊构造器来引用它们(否则,不能将构造函数声明出类--声明必须引用它!)。在C++0x中,使用声明也必须能够引用它们,使用提供的特殊构造(有关如何引用构造函数的方法,请参见3.4.3.1/2 )。

析构函数的查找是相当复杂的,并且在标准中有很多错误。有关更多细节,请参见本期报告

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2693199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档