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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- try、catch、throw
- 例外安全性
- noexcept指定子
- カスタム例外型