質問

次のコードを考えてみましょう。

#include <iostream>

typedef int t;
t a=42;

int main()
{
    a.t::~t();
    std::cout << a; //42
}

私はそれを期待されています a 破壊されます。しかし、それは真実ではありません。なぜでしょうか?その疑似デストラクター呼び出しはどのようにしてオブジェクトを破棄するのでしょうか?

役に立ちましたか?

解決

しかし、それは真実ではありません。なぜでしょうか?

§5.2.4/1:

唯一の効果 は、ドットまたは矢印の前の postfix-expression の評価です。

ここで、postfix-expression は、呼び出しが行われるオブジェクトの式です。したがって、疑似デストラクター呼び出しは、単純なデストラクターへの呼び出しとして、それが適用されるオブジェクトの存続期間を終了させるものではありません。例えば、

int i = 0;
(i += 5).~decltype(i)();
std::cout << i;

スカラーにはデストラクターがないため、実際にはデストラクターを呼び出すことはできません ([class.dtor] を参照)。このステートメントは、型が不明なオブジェクトのデストラクターを呼び出すテンプレート コードに対してのみ許可されます。これにより、スカラー型の特殊化を作成する必要がなくなります。


コメントでは、[expr.pseudo] はスカラーのデストラクターの存在を暗示していることに注意してください。

の使用 擬似デストラクタ名 ドットの後 . または矢印 -> オペレーターは、によって名前が付けられたクラス以外のタイプのデストラクタを表します 型名.

ただし、これは規格の他の部分と矛盾します。§12 では、デストラクターを特別なメンバー関数として呼び出し、次のことについて言及しています。

デストラクターは、そのクラス型のオブジェクトを破棄するために使用されます。

これは C++98 時代に作られた不正確さのようです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top