noexcept 演算子 (C++11 以降)
From cppreference.com
noexcept 演算子は、式が例外をスローしないと宣言されている場合に true を返すコンパイル時チェックを実行します。
関数テンプレートの noexcept 指定子内で使用され、一部の型では例外をスローするが、他の型ではスローしないことを宣言できます。
目次 |
[編集] 構文
noexcept( expression ) |
|||||||||
型 bool の prvalue を返します。結果は、expression の 潜在的な例外の集合が空である(C++17 まで)expression が 非スローであると指定されている(C++17 以降)場合に true、それ以外の場合は false です。
expression は 評価されないオペランドです。
|
expression が prvalue の場合、一時オブジェクトの具体化が適用されます。 |
(C++17以降) |
[編集] 備考
noexcept(expr) が true であっても、expr の評価は未定義動作に遭遇した結果として例外をスローする可能性があります。
|
expression がクラス型、またはその (多次元) 配列である場合、一時オブジェクトの具体化には、デストラクタが削除されておらず、アクセス可能である必要があります。 |
(C++17以降) |
[編集] キーワード
[編集] 例
このコードを実行
#include <iostream> #include <utility> #include <vector> void may_throw(); void no_throw() noexcept; auto lmay_throw = []{}; auto lno_throw = []() noexcept {}; class T { public: ~T(){} // dtor prevents move ctor // copy ctor is noexcept }; class U { public: ~U(){} // dtor prevents move ctor // copy ctor is noexcept(false) std::vector<int> v; }; class V { public: std::vector<int> v; }; int main() { T t; U u; V v; std::cout << std::boolalpha << "may_throw() is noexcept(" << noexcept(may_throw()) << ")\n" "no_throw() is noexcept(" << noexcept(no_throw()) << ")\n" "lmay_throw() is noexcept(" << noexcept(lmay_throw()) << ")\n" "lno_throw() is noexcept(" << noexcept(lno_throw()) << ")\n" "~T() is noexcept(" << noexcept(std::declval<T>().~T()) << ")\n" // note: the following tests also require that ~T() is noexcept because // the expression within noexcept constructs and destroys a temporary "T(rvalue T) is noexcept(" << noexcept(T(std::declval<T>())) << ")\n" "T(lvalue T) is noexcept(" << noexcept(T(t)) << ")\n" "U(rvalue U) is noexcept(" << noexcept(U(std::declval<U>())) << ")\n" "U(lvalue U) is noexcept(" << noexcept(U(u)) << ")\n" "V(rvalue V) is noexcept(" << noexcept(V(std::declval<V>())) << ")\n" "V(lvalue V) is noexcept(" << noexcept(V(v)) << ")\n"; }
出力
may_throw() is noexcept(false) no_throw() is noexcept(true) lmay_throw() is noexcept(false) lno_throw() is noexcept(true) ~T() is noexcept(true) T(rvalue T) is noexcept(true) T(lvalue T) is noexcept(true) U(rvalue U) is noexcept(false) U(lvalue U) is noexcept(false) V(rvalue V) is noexcept(true) V(lvalue V) is noexcept(false)
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| CWG 2722 | C++17 | 一時オブジェクトの具体化が expression が prvalue の場合に適用されるか不明瞭であった |
適用される この場合に |
| CWG 2792 | C++11 | noexcept 演算子は、例外が未定義動作に遭遇した場合にスローされるかどうかを判断することが求められていた |
要求されない |
[編集] 関連項目
noexcept 指定子(C++11) |
関数が例外をスローするかどうかを指定します |
| 動的例外指定(C++17 まで) | 関数によってスローされる例外を指定します (C++11 で非推奨) |