C++ Programmingメモ 2024/06/17 デストラクタ noexcept

● いきなり結論
dtorは可能な限り noexcept を明示的につける。

● 参考サイト
非自明なデフォルトのデストラクタは暗黙にnoexcept
https://faithandbrave.hateblo.jp/entry/20120322/1332399681
C++ の noexcept specifier のちょっとややこしい仕様
https://zenn.dev/mafafa/articles/a8ae1e546f7634

● 仕様の要点だけを抽出
- 派生クラスのdtorが例外を出すなら、dtorは暗黙にnoexcept(false)である
- 基底クラスのdtorがvirtualかつ例外を出すなら、dtorは暗黙にnoexcept(false)である
- = deleteと定義したら、dtorのnoexceptは翻訳対象から外れ考慮外になる
- 上記に当てはまらなかったら暗黙にnoexcept(true)である
上記のルールにより、declareとdefineとでnoexcept(true|false)が入れ替わるということが起こり得る

● ハマった点
Effective Modern C++ 項目22: Pimpl イディオムを用いる際は特殊メンバ関数を定義する
のルールに則ると、
- a.hpp に class A で virtual ~A(); とdeclare する
- a.cpp に class A で A::~A() = default; と define する
という具合になると思う。
が、このように書くと、バカマジメに仕様を解釈しようとするやつ(某静的解析ツール)は、
- declare と define とで noexcept のprototypeが異なるかもしれない
みたいなことを言い出す。
回避するためには、基本的に noexcept(true) であると明示した方が良いとなる。
- a.hpp に class A で virtual ~A() noexcept; とdeclare する
- a.cpp に class A で A::~A() noexcept = default; と define する

● 所感
C++マジ闇。。マリカしょ。。

このブログ記事について

このページは、らるるが2024年6月17日 22:05に書いたブログ記事です。

ひとつ前のブログ記事は「Linux memo 2024/05/23 録画サーバ編」です。

次のブログ記事は「「Binary Hacks Rebooted」読んだ」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0