根据标准,类析构函数是否具有迂腐意义上的名称?
回想一下,构造函数显然没有名称:
构造函数没有名称。一个 使用特殊声明符语法 可选序列 接下来是函数说明符(7.1.2) 由构造函数的类名 后面跟着一个参数列表 声明或定义构造函数。 在这样的声明中,可选 构造函数周围的括号 类名被忽略。
标准没有明确声明析构函数有或没有名称,但有许多引用如何使用特殊语言引用和声明析构函数,其中没有一个直接引用析构函数的名称。这个问题似乎在不同的地方绕过:
使用。的特殊声明符语法 可选的函数说明符(7.1.2) 然后是〜接着是 析构函数的类名后跟一个 空参数列表用于 在类中声明析构函数 定义
使用伪析构函数名称 一点之后。或箭头 - >操作者 代表了析构函数 由type-name命名的非类类型。该 结果只能用作 函数调用操作符的操作数 (),这样的调用的结果有 类型无效。唯一的影响是 评估后缀表达式 在点或箭头之前。
在显式的析构函数调用中, 析构函数名称显示为〜 后跟一个名字命名的类型名称 析构函数的类类型。该 析构函数的调用是主题 通常的会员规则 功能(9.3),即如果 对象不是析构函数的 类类型而不是派生类 从析构函数的类类型来看 程序有不确定的行为(除了 在空指针上调用delete 没有效果。)
最后一种情况(12.4.12)似乎是对析构函数名称的最直接引用,但它仍然避免说析构函数有一个名称,并且对此非常暧昧。 12.4.12可以解释为“blah是析构函数的名称”或“析构函数没有名称,但你可以将析构函数称为blah。”
那么,析构函数是否有名字?
答案 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/3
和3.4.3/6
)。这样的构造由~
标记和名称组成,引用构造函数的类。通常称它为析构函数的“名称”(就像标准3.4.3.1/2
谈论“构造函数名称”) - 但很迂腐,它不是一个名字。
所以,如果你是迂腐的,你会说析构函数没有自己的名字,而是使用特殊的机制来引用它。同样对于构造函数,特殊构造用于引用它们(否则,您无法在类外声明构造函数 - 声明必须引用它!)。在C ++中,0x声明必须能够使用提供的特殊结构引用它们(有关如何引用构造函数,请参阅3.4.3.1/2
)。
析构函数查找非常复杂,并且标准中存在相当多的错误。有关详细信息,请参阅this issue report。