0Pricing
C++ Academy · レッスン

noexcept指定子

例外を投げない関数を示します

「noexcept指定子」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

noexcept が宣言する内容

noexcept指定子は、関数が例外を発生させないことを保証します。それでも例外が発生すると、プログラムはstd::terminateを呼び出します。

#include <iostream>

int square(int x) noexcept {
    return x * x;
}

int main() {
    std::cout << square(5) << "\n";
}

なぜ重要なのか

関数が例外を発生させないと分かっていれば、コンパイラやライブラリは最適化できます。たとえば、コンテナの拡張時にコピーではなくムーブを選択できます。

ムーブ操作には noexcept を付ける

std::vectorは、再確保時にnoexceptが付いている場合に限りムーブコンストラクタを使用します。それ以外の場合は安全性のためにコピーします。そのため、ムーブにはnoexceptを付けてください。

struct Buffer {
    int* p;
    Buffer(Buffer&& o) noexcept : p(o.p) { o.p = nullptr; }
};

デストラクタはデフォルトで noexcept

C++11以降、デストラクタは暗黙的にnoexceptです。デストラクタから例外を外へ伝播させると、プログラムは終了します。

条件付き noexcept

noexcept(expr)を使うと、コンパイル時のブール値に応じて保証を変えられます。別の型の保証を引き継ぐテンプレートで役立ちます。

template <class T>
void swapValues(T& a, T& b) noexcept(noexcept(T(std::move(a)))) {
    T tmp = std::move(a);
    a = std::move(b);
    b = std::move(tmp);
}

noexcept 演算子による確認

演算子としてのnoexcept(expr)は、その式が例外を発生させないと宣言されている場合にtrueを返します。テンプレートで便利です。

#include <iostream>

int f() noexcept { return 1; }
int g() { return 2; }

int main() {
    std::cout << noexcept(f()) << " " << noexcept(g()) << "\n";  // 1 0
}

noexcept は型の一部

C++17以降、noexceptは関数ポインタの型の一部です。そのため、例外を発生させる関数をnoexceptポインタに束縛することはできません。

過剰な保証をしない

例外を発生させないと確信できる場合にのみ、関数にnoexceptを付けてください。偽の保証に違反すると、プログラム全体がクラッシュします。

適した候補

swap、ムーブ、デストラクタ、単純なgetter、算術ヘルパーは、noexcept関数に適しています。

noexcept と throw()

古い動的throw()仕様は非推奨となり、削除されました。現代のC++では代わりにnoexceptを使用してください。

パフォーマンスと安全性

noexceptは意図を文書化すると同時に、再確保時のムーブなどの最適化を可能にします。小さな注釈ですが、実際の効果があります。

クイックチェック

noexceptの理解度を確認しましょう。

まとめ

noexcept指定子は例外が発生しないことを保証し、再確保時のムーブなどの最適化を可能にすることを学びました。ムーブ、swap、デストラクタにはnoexceptを付け、テンプレートでは条件付き形式を使い、過剰な保証はしないでください。

よくある質問

「noexcept指定子」レッスンは無料ですか?

はい。「noexcept指定子」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「noexcept指定子」で何を学びますか?

例外を投げない関数を示します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「noexcept指定子」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. try、catch、throw
  2. 例外安全性
  3. noexcept指定子
  4. カスタム例外型
← C++ Academyに戻る