Skip to content

Commit 477414c

Browse files
committed
fix: optional::reset is marked constexpr at 23
P2231R1
1 parent ccf8ee7 commit 477414c

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

lang/cpp23/relaxing_some_constexpr_restrictions.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ constexpr int g(int x) { return f(x); } // error! fはいかなるxについて
2424
2525
しかし、多くの標準ライブラリが`constexpr`対応を進めていくようになり、状況が変化した。
2626
27-
例えば、`std::optional`の`reset`メンバメソッドが`constexpr`に対応するのはC++20以降である
27+
例えば、`std::optional`の`reset`メンバメソッドが`constexpr`に対応するのはC++23以降である
2828
これは`std::optional`の内部実装が`union`のアクティブメンバを更新しているからであり、[これを定数式内で実行するにはC++20を待たねばならなかった](https://cpprefjp.github.io/lang/cpp20/changing_the_active_member_of_a_union_inside_constexpr.html)。
2929
30-
よって、以下のコードはC++17では不適格だが、C++20では正しいコードとなる
30+
よって、以下のコードはC++17では不適格だが、C++23では正しいコードとなる
3131
3232
```cpp
3333
template<typename T>
@@ -38,17 +38,17 @@ constexpr void f(std::optional<T>& opt)
3838
```
3939

4040
これを正しく記述するには、`constexpr`指定をするかどうかをマクロで変更しなければならない。
41-
例えばC++20から`constexpr`になる関数群に対して以下のようなマクロを使うか、
41+
例えばC++23から`constexpr`になる関数群に対して以下のようなマクロを使うか、
4242

4343
```cpp
44-
#if __cplusplus >= 202002L
45-
# define MYLIB_CXX20_CONSTEXPR constexpr
44+
#if __cplusplus >= 202300L // 具体的な値は未定
45+
# define MYLIB_CXX23_CONSTEXPR constexpr
4646
#else
47-
# define MYLIB_CXX20_CONSTEXPR
47+
# define MYLIB_CXX23_CONSTEXPR
4848
#endif
4949

5050
template<typename T>
51-
MYLIB_CXX20_CONSTEXPR void f(std::optional<T>& opt)
51+
MYLIB_CXX23_CONSTEXPR void f(std::optional<T>& opt)
5252
{
5353
opt.reset();
5454
}

0 commit comments

Comments
 (0)