析构函数是否按照标准命名?

时间:2010-04-22 17:55:07

标签: c++

根据标准,类析构函数是否具有迂腐意义上的名称?

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

12.1.1:

  

构造函数没有名称。一个   使用特殊声明符语法   可选序列   接下来是函数说明符(7.1.2)   由构造函数的类名   后面跟着一个参数列表   声明或定义构造函数。   在这样的声明中,可选   构造函数周围的括号   类名被忽略。

标准没有明确声明析构函数有或没有名称,但有许多引用如何使用特殊语言引用和声明析构函数,其中没有一个直接引用析构函数的名称。这个问题似乎在不同的地方绕过:

12.4.1:

  

使用。的特殊声明符语法   可选的函数说明符(7.1.2)   然后是〜接着是   析构函数的类名后跟一个   空参数列表用于   在类中声明析构函数   定义

5.2.4.1:

  

使用伪析构函数名称   一点之后。或箭头 - >操作者   代表了析构函数   由type-name命名的非类类型。该   结果只能用作   函数调用操作符的操作数   (),这样的调用的结果有   类型无效。唯一的影响是   评估后缀表达式   在点或箭头之前。

12.4.12:

  

在显式的析构函数调用中,   析构函数名称显示为〜   后跟一个名字命名的类型名称   析构函数的类类型。该   析构函数的调用是主题   通常的会员规则   功能(9.3),即如果   对象不是析构函数的   类类型而不是派生类   从析构函数的类类型来看   程序有不确定的行为(除了   在空指针上调用delete   没有效果。)

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

那么,析构函数是否有名字?

1 个答案:

答案 0 :(得分:8)

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

  

名称是使用标识符(2.11),operator-function-id(13.5),conversion-function-id(12.3.2)或template-id(14.2)表示实体或标签(6.6) .4,6.1)。

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

我认为,我们示例中的构造不是名称,而是两个名称,一个符合另一个名称。析构函数由构造~ class-name引用(请参阅3.4.5/33.4.3/6)。这样的构造由~标记和名称组成,引用构造函数的类。通常称它为析构函数的“名称”(就像标准3.4.3.1/2谈论“构造函数名称”) - 但很迂腐,它不是一个名字。

所以,如果你是迂腐的,你会说析构函数没有自己的名字,而是使用特殊的机制来引用它。同样对于构造函数,特殊构造用于引用它们(否则,您无法在类外声明构造函数 - 声明必须引用它!)。在C ++中,0x声明必须能够使用提供的特殊结构引用它们(有关如何引用构造函数,请参阅3.4.3.1/2)。

析构函数查找非常复杂,并且标准中存在相当多的错误。有关详细信息,请参阅this issue report