按照标准,类析构函数是否有学究意义上的名称?
回想一下,构造函数显式地没有名称:
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“。
那么,析构函数有名字吗?
发布于 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/3和3.4.3/6)。这种构造由一个~令牌和一个名称组成,引用构造函数的类。传统上称它为析构函数的“名称”(就像3.4.3.1/2上的标准讨论“构造函数名”一样)--但实际上,它不是一个名称。
所以,如果你是脚踏实地的,你会说一个析构函数没有自己的名字,而是使用特殊的机制来引用它。同样,对于构造函数,使用特殊构造器来引用它们(否则,不能将构造函数声明出类--声明必须引用它!)。在C++0x中,使用声明也必须能够引用它们,使用提供的特殊构造(有关如何引用构造函数的方法,请参见3.4.3.1/2 )。
析构函数的查找是相当复杂的,并且在标准中有很多错误。有关更多细节,请参见本期报告。
https://stackoverflow.com/questions/2693199
复制相似问题