我注意到伪析构函数调用在使用类型名称时有效,但在使用基本类型时则无效.
typedef int BType;
int b;
b.~BType(); // Legal
b.~int(); // Not legal
Run Code Online (Sandbox Code Playgroud)
可以在对另一个SO帖子的答案中找到对上述的解释.
类型名称的定义,来自C++ 11标准:
7.1.6.2简单类型说明符,p1
type-name: class-name enum-name typedef-name simple-template-id
当类型说明符是类型名称时是否有任何其他语言结构,但是当它是基本类型时无效,即使type-name表示基本类型,如上所示?
我认为您不会发现任何其他案例。如果我们查看 C++ 标准草案附件A 语法摘要,我们可以看到语法中出现类型名称的唯一其他位置是:
nested-name-specifier:
::
type-name ::
namespace-name ::
decltype-specifier ::
nested-name-specifier identifier ::
nested-name-specifier templateopt simple-template-id ::
Run Code Online (Sandbox Code Playgroud)
和:
simple-type-specifier:
nested-name-specifieropt type-name
[...]
Run Code Online (Sandbox Code Playgroud)
两者都没有提供与伪析构函数类似的机会,伪析构函数具有以下语法:
pseudo-destructor-name:
nested-name-specifieropt type-name :: ~ type-name
nested-name-specifier template simple-template-id :: ~ type-name
nested-name-specifieropt~ type-name
~ decltype-specifier
Run Code Online (Sandbox Code Playgroud)
并在5.2.4[expr.pseudo] 部分中进行了介绍,该部分提供了我们看到的行为:
在点后使用伪析构函数名称。或箭头 -> 运算符表示由类型名称或 decltype-specifier 表示的非类类型的析构函数。结果只能用作函数调用运算符 () 的操作数,并且此类调用的结果类型为 void。唯一的效果是对点或箭头之前的后缀表达式进行求值。
另一方面,我们可以在3.4.3 [basic.lookup.qual]部分中看到嵌套名称说明符的规则禁止这种情况:
类或命名空间成员或枚举数的名称可以在应用于表示其类、命名空间或枚举的嵌套名称说明符的 :: 范围解析运算符 (5.1) 之后引用。如果嵌套名称说明符中的 :: 范围解析运算符前面没有 decltype 说明符,则查找 :: 之前的名称仅考虑专门化为类型的命名空间、类型和模板。如果找到的名称未指定命名空间或类、枚举或依赖类型,则该程序格式错误
简单类型说明符的情况也不能让我们到达那里,因为基本类型对于这种情况已经是可以接受的。