読者です 読者をやめる 読者になる 読者になる

とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

あいまいな operator~ とデストラクタの解決

C++

クイズ

次の実行結果はどうなるでしょうか?
一時オブジェクト生成の後に operator~ が呼ばれるのでしょうか?それとも,いきなりデストラクタが呼ばれるのでしょうか?それとも未定義動作でしょうか?

#include<iostream>

struct tilde
{
 tilde()
 {
  std::cout << "constructor" << std::endl;
 }
 ~tilde()
 {
  std::cout << "destructor" << std::endl;
 }
 void operator~()
 {
  std::cout << "operator~" << std::endl;
 }
};

int main()
{
 ~tilde();
}

答え

正解は「一時オブジェクト生成後に operator~ が呼ばれる」です。
実行結果:

constructor
operator~
destructor

JIS X3014 には次のように書いてあります。

5.3.1 単項演算子 (snip)
9 (snip) X がクラス名の場合,単項式 ~X() にはあいまい性がある。そ
のあいまい性は,~X をデストラクタの参照として扱うのではなく,むしろ ~ を単項の補数演算子として扱うことに
することによって解決される。