◐ Shell
clean mode source ↗

noexcept 演算子(C++11以上) - cppreference.com

提供: cppreference.com

noexcept 演算子は式がいかなる例外も投げないと宣言された場合に true を返すコンパイル時チェックを行います。

関数が何らかの型に対しては例外を投げるけれどもそれ以外の型に対しては投げないことを宣言するために、関数テンプレートの noexcept 指定子内で使用できます。

構文

noexcept( expression )

bool 型の prvalue を返します。

説明

noexcept 演算子は expression を評価しません。

expression が以下の評価される可能性のある構文要素を少なくともひとつ含む場合、結果は false です。

  • 定数式である場合を除き、例外を投げない例外指定を持たない任意の型の関数の呼び出し。
  • throw
  • ターゲット型が参照型であり変換が実行時チェックを必要とするときの dynamic_cast
  • 引数の型が多相クラス型のときの typeid

それ以外のすべての場合、結果は true です。

(C++17未満)

expression潜在的な例外の集合が空であれば結果は true であり、そうでなければ false です。

(C++17以上)

キーワード

noexcept

#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

関連項目