名前空間
変種
操作

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

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 
例外
tryブロック
例外を送出する
例外を処理する
例外仕様
    noexcept 指定 (C++11)
    動的例外指定 (C++17* まで)
noexcept 演算子 (C++11)
 

noexcept 演算子は、式が例外をスローしないと宣言されている場合に true を返すコンパイル時チェックを実行します。

関数テンプレートの noexcept 指定子内で使用され、一部の型では例外をスローするが、他の型ではスローしないことを宣言できます。

目次

[編集] 構文

noexcept( expression )

boolprvalue を返します。結果は、expression潜在的な例外の集合が空である(C++17 まで)expression非スローであると指定されている(C++17 以降)場合に true、それ以外の場合は false です。

expression評価されないオペランドです。

expression が prvalue の場合、一時オブジェクトの具体化が適用されます。

(C++17以降)

[編集] 備考

noexcept(expr)true であっても、expr の評価は未定義動作に遭遇した結果として例外をスローする可能性があります。

expression がクラス型、またはその (多次元) 配列である場合、一時オブジェクトの具体化には、デストラクタが削除されておらず、アクセス可能である必要があります。

(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(){} // 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 で非推奨) [編集]
English 日本語 中文(简体) 中文(繁體)