10/03/31 12:41:34
>>71
わかったよ。
URLリンク(www.open-std.org)
以下の2点が throw() とは違う。
- noexcept 違反の場合、 terminate() が呼ばれるまでにスタックの巻き戻しが
済んでいるかどうかをを実装依存とすること。
- xxx_nothrow_xxx<> メタ関数によって情報にアクセスできること。
つまり >>42 を素直に信じて考えてしまったのが間違いだったわけだ。ごめんよ。
前者については、ほんとうにこのスタックの巻き戻しが最適化の妨げだったのか
(暗黙のハンドラの存在が問題だったのではないのか?)という点で疑問が残るが、
後者については大幅な状況の改善が期待できる。
任意の式について例外を投げうるかどうか判定する noexcept 演算子なんてあるんだな。
・・・あれ?
これと同じことを関数の中身についてコンパイラが勝手にやってくれればいいだけなのになぁ。
↓こんなのがイディオムになっちゃったりするのかなぁ・・・
#define FUNCTION_BODY_EXPR \
expr1,\
expr2,\
expr3,\
...
void f() noexcept { FUNCTION_BODY_EXPR; }
static_assert(noexcept(FUNCTION_BODY_EXPR), "noexcept violation");