Skip to content

Commit 8b71c43

Browse files
committed
feat: C++23 non-literal vars in constexpr funcs
1 parent 041ff2d commit 8b71c43

File tree

1 file changed

+31
-0
lines changed

1 file changed

+31
-0
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# 定数式内での非リテラル変数、静的変数・スレッドローカル変数およびgotoとラベルの存在を許可する
2+
* cpp23[meta cpp]
3+
4+
## 概要
5+
6+
`constexpr`関数が非リテラル変数、静的変数・スレッドローカル変数およびgoto文とラベルを含むことを許可する。
7+
8+
ただし、これをコンパイル時に評価した場合、従来通りエラーとなる。
9+
これらを含むコードパスは実行時にのみ通過するようにしなければならない。
10+
11+
## この機能が必要になった背景・経緯
12+
13+
これまでは、`constexpr`関数内には非リテラル変数、静的変数・スレッドローカル変数およびgoto文とラベルが含まれてはならなかった。
14+
これは、`constexpr`関数が定数式実行できない要素を含んではならないという意味で、理にかなった制限であった。
15+
16+
しかし、C++20で[`std::is_constant_evaluated`](/reference/type_traits/is_constant_evaluated.md)によって定数式実行されるコードパスと実行時に通るコードパスを分けることが可能になり、状況が変化した。
17+
定数式実行できないコードとはいえ、実行時にのみ通りコンパイル時には通らないコードパスに含まれていた場合にもプログラムが不適格となる、というのは直観に反する。
18+
19+
よって、コンパイル時に評価されない限りにおいて、`constexpr`関数内に非リテラル変数、静的変数・スレッドローカル変数およびgoto文とラベルを含むことが許可されることとなった。
20+
21+
ただし、`constexpr`内に存在することが許可されたものの定数式として評価できるわけではないので、これらの機能は依然としてコンパイル時に使用することはできない。
22+
23+
## 関連項目
24+
25+
- [C++20 - constexpr関数内でのtry-catchブロックを許可](/lang/cpp20/try-catch_blocks_in_constexpr_functions.html)
26+
- [C++20 - constexpr関数内で未評価のインラインアセンブリを許可することによる組み込み関数のconstexpr有効化](/lang/cpp20/enabling_constexpr_intrinsics_by_permitting_unevaluated_inline-assembly_in_constexpr_functions.html)
27+
- [C++23 - constexpr関数のすべての引数が定数実行できない場合でも適格とする](/lang/cpp23/relaxing_some_constexpr_restrictions.md)
28+
29+
## 参照
30+
31+
- [P2242R3 - Non-literal variables (and labels and gotos) in constexpr functions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2242r3.html)

0 commit comments

Comments
 (0)