擬似デストラクタ呼び出しは、タイプ名使用されますが、基本型が使用される場合には使用されません。
typedef int BType;
int b;
b.~BType(); // Legal
b.~int(); // Not legal
上記の説明については、別のSO投稿への回答。
定義タイプ名C++11 標準より:
7.1.6.2 単純な型指定子、p1
タイプ名: クラス名 列挙名 型定義名 シンプルテンプレートID
型指定子がaの場合に有効な他の言語構造はありますか?タイプ名しかし、基本型の場合は有効ではありません。タイプ名上記のように基本型を表しますか?
ベストアンサー1
他に例がないと思います。C++標準の草案を見ると付録A 文法概要文法上の他の箇所ではタイプ名表示されるのは以下のとおりです:
nested-name-specifier:
::
type-name ::
namespace-name ::
decltype-specifier ::
nested-name-specifier identifier ::
nested-name-specifier templateopt simple-template-id ::
そして:
simple-type-specifier:
nested-name-specifieropt type-name
[...]
どちらも、次の文法を持つ擬似デストラクタで得られるのと同様の機会を提供しません。
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
5.2.4
これは、私たちが目にする動作を提供するセクション [expr.pseudo] で説明されています。
ドット . または矢印 -> 演算子の後の擬似デストラクタ名の使用は、type-name または decltype-specifier で示される非クラス型のデストラクタを表します。結果は関数呼び出し演算子 () のオペランドとしてのみ使用され、そのような呼び出しの結果は void 型になります。唯一の効果は、ドットまたは矢印の前の postfix-expression の評価です。
一方、入れ子の名前指定子のルールはセクション3.4.3
[基本的なルックアップ品質]このようなケースを禁止する:
クラスまたは名前空間のメンバーまたは列挙子の名前は、そのクラス、名前空間、または列挙を表す入れ子の名前指定子に :: スコープ解決演算子 (5.1) を適用した後に参照できます。入れ子の名前指定子内の :: スコープ解決演算子の前に decltype 指定子がない場合、その :: の前の名前の検索では、特殊化が型である名前空間、型、およびテンプレートのみが考慮されます。見つかった名前が名前空間またはクラス、列挙、または依存型を指定していない場合、プログラムは不正な形式です。
単純な型指定子のケースでも、基本型はすでにこのケースで受け入れられるため、目的を達成できません。