最終更新日時: 2025年08月14日 13時38分40秒 (JST)
Akira Takahashi が更新

履歴 編集

# constexpr関数内でのtry-catchブロックを許可 [P1002R1](C++20)

このページはC++20に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

## 概要

C++20では、`constexpr`関数内でのtry-catchブロックの使用を許可する。ただし、`throw`式は従来通り許可せず、コンパイルエラーとなる (`throw`式は`constexpr`関数におけるアサーションのような役割)。

    constexpr int f(int x) {
      // C++17まではconstexpr関数内でtry/catchブロックを使用するとコンパイルエラー
      try {
        return x + 1;
      }
      catch (...) {
        return 0;
      }
    }

## この機能が必要になった背景・経緯

この機能が必要になったのは、リフレクションとメタプログラミングのためである。コンパイル時定数として`std::vector`を使用できるようにするためには、try-catchブロックを許可することが必要であった。libc++での`vector::insert()`の実装において、try-catchブロックを使用して強い例外安全性の保証を提供している。

## 関連項目

- C++11 `constexpr`
- C++20 可変サイズをもつコンテナの`constexpr`化

## 参照

- P1002R1 Try-catch blocks in constexpr functions