Skip to content

Commit

Permalink
擬似デストラクタ呼び出しの例を追記
Browse files Browse the repository at this point in the history
  • Loading branch information
onihusube committed Feb 21, 2023
1 parent afa0dc5 commit cf2f9ac
Showing 1 changed file with 18 additions and 2 deletions.
Expand Up @@ -213,13 +213,29 @@ C++においては、ポインタに対する演算(`+ -`など)はそのポ
C++17まで、擬似デストラクタ呼び出しには何の効果もなかった(テンプレートの文脈でクラス型との構文上の互換性を取るためのものでしかなかった)が、C++20からは擬似デストラクタ呼び出しはそのスカラー型オブジェクトの生存期間を終了させることが規定される。
```cpp
constexpr int f() {
int a = 123;
using T = int;
// 擬似デストラクタ呼び出し
// C++20からはaの生存期間を終了させる
// C++17までは何も効果がない
a.~T();
return a; // C++20からはUB、C++17までは123を返す
}
static_assert(f() == 123); // C++20からはUBが起こるため不適格、C++17以前は適格
```

これに伴い、[`destroy_at()`](/reference/memory/destroy_at.md)などの擬似デストラクタ呼び出しと等価のことを行うライブラリ機能においても、スカラ型のオブジェクトの生存期間を終了させるようになる。

### これらの変更の影響

これらの変更はあくまでオブジェクト生存期間に関する規則を変更しただけに過ぎず、その影響はコンパイラ等の実装のオブジェクト生存期間の認識が変わるだけである。それによって、今まで未定義動作となっていたコードが未定義動作ではなくなり、未定義動作をトリガーとする最適化を受ける可能性が将来にわたって取り除かれることになる。
これらの変更はあくまでオブジェクト生存期間に関する規則を変更しただけに過ぎず、その影響はコンパイラ等の実装のオブジェクト生存期間の認識が変わるだけである。それによって、今まで未定義動作となっていたコードが未定義動作ではなくなり、未定義動作をトリガーとする最適化を受ける可能性が将来にわたって取り除かれることになる(ただし、擬似デストラクタ呼び出し周りの変更だけは、未定義動作ではなかったコードを未定義動作にしうる)

したがって、これらの変更によって最適化によるもの以外の実行時の振る舞いが変化することはなく、暗黙的なオブジェクト構築は実際にコンストラクタを呼んだり何か初期化を行うものではない。
したがって、擬似デストラクタ呼び出しを除いて、これらの変更によって最適化によるもの以外の実行時の振る舞いが変化することはなく、暗黙的なオブジェクト構築は実際にコンストラクタを呼んだり何か初期化を行うものではない。

##
(執筆中)
Expand Down

1 comment on commit cf2f9ac

@onihusube
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.