noexcept 演算子(C++11以上)
提供: cppreference.com
noexcept
演算子は式がいかなる例外も投げないと宣言された場合に true を返すコンパイル時チェックを行います。
関数が何らかの型に対しては例外を投げるけれどもそれ以外の型に対しては投げないことを宣言するために、関数テンプレートの noexcept 指定子内で使用できます。
目次 |
[編集] 構文
noexcept( expression )
|
|||||||||
bool 型の prvalue を返します。
[編集] 説明
noexcept
演算子は expression を評価しません。
expression が以下の評価される可能性のある構文要素を少なくともひとつ含む場合、結果は
それ以外のすべての場合、結果は |
(C++17未満) |
expression の潜在的な例外の集合が空であれば結果は |
(C++17以上) |
[編集] キーワード
[編集] 例
Run this code
#include <iostream> #include <utility> #include <vector> void may_throw(); void no_throw() noexcept; auto lmay_throw = []{}; auto lno_throw = []() noexcept {}; class T{ public: ~T(){} // デストラクタはムーブコンストラクタを抑制します。 // コピーコンストラクタは noexcpt です。 }; class U{ public: ~U(){} // デストラクタはムーブコンストラクタを抑制します。 // コピーコンストラクタは 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 << "Is may_throw() noexcept? " << noexcept(may_throw()) << '\n' << "Is no_throw() noexcept? " << noexcept(no_throw()) << '\n' << "Is lmay_throw() noexcept? " << noexcept(lmay_throw()) << '\n' << "Is lno_throw() noexcept? " << noexcept(lno_throw()) << '\n' << "Is ~T() noexcept? " << noexcept(std::declval<T>().~T()) << '\n' // 注: 以下のテストは、 noexcept 内の式が一時オブジェクトの構築と破棄を行うため、 // ~T() が noexcept であることも要求します。 << "Is T(rvalue T) noexcept? " << noexcept(T(std::declval<T>())) << '\n' << "Is T(lvalue T) noexcept? " << noexcept(T(t)) << '\n' << "Is U(rvalue U) noexcept? " << noexcept(U(std::declval<U>())) << '\n' << "Is U(lvalue U) noexcept? " << noexcept(U(u)) << '\n' << "Is V(rvalue V) noexcept? " << noexcept(V(std::declval<V>())) << '\n' << "Is V(lvalue V) noexcept? " << noexcept(V(v)) << '\n'; }
出力:
Is may_throw() noexcept? false Is no_throw() noexcept? true Is lmay_throw() noexcept? false Is lno_throw() noexcept? true Is ~T() noexcept? true Is T(rvalue T) noexcept? true Is T(lvalue T) noexcept? true Is U(rvalue U) noexcept? false Is U(lvalue U) noexcept? false Is V(rvalue V) noexcept? true Is V(lvalue V) noexcept? false
[編集] 関連項目
noexcept 指定子(C++11)
|
関数にいかなる例外も投げないことを要求します |
動的例外指定(C++17未満) | 何の例外が関数によって投げられるかを指定します (C++11で非推奨) |