名前空間
変種
操作

noexcept 演算子(C++11以上)

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (C++20未満)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 

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

[編集] 関連項目

noexcept 指定子(C++11) 関数にいかなる例外も投げないことを要求します[edit]
動的例外指定(C++17未満) 何の例外が関数によって投げられるかを指定します (C++11で非推奨) [edit]