Skip to content

Commit

Permalink
refactor: simplify explanation of P2448R2
Browse files Browse the repository at this point in the history
relaxing-some-constexpr-restrictions
  • Loading branch information
ToruNiina committed Apr 15, 2024
1 parent 8ed33cb commit d9744ca
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions lang/cpp23/relaxing_some_constexpr_restrictions.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ constexpr int g(int x) { return f(x); } // error! fはいかなるxについて
しかし、多くの標準ライブラリが`constexpr`対応を進めていくようになり、状況が変化した。
例えば、`std::optional`の`reset`メンバメソッドが`constexpr`に対応するのはC++23以降である。
これは`std::optional`の内部実装が`union`のアクティブメンバを更新しているからであり、[これを定数式内で実行するにはC++20を待たねばならなかった](/lang/cpp20/changing_the_active_member_of_a_union_inside_constexpr.md)。
これは`std::optional`の内部実装が`union`のアクティブメンバを更新しているからであり、これを定数式内で実行するにはC++20を待たねばならなかった(参考:[定数式内での共用体のアクティブメンバの変更を許可](/lang/cpp20/changing_the_active_member_of_a_union_inside_constexpr.md)
よって、以下のコードはC++17では不適格だが、C++23では正しいコードとなる。
Expand All @@ -37,7 +37,7 @@ constexpr void f(std::optional<T>& opt)
}
```

これを正しく記述するには`constexpr`指定をするかどうかをマクロで変更しなければならない
多くのバージョンで使われることが想定されるライブラリにおいてこれを最大限活用できるよう記述するには`constexpr`指定するかどうかをマクロで変更しなければならない
例えばC++23から`constexpr`になる関数群に対して以下のようなマクロを使うか、

```cpp
Expand Down Expand Up @@ -77,9 +77,9 @@ void f(std::optional<T>& opt)
このような状況では上記のような解決策を用いてもミスを避けることは容易ではない。

現在、登場時点では定数式内で実行できなかったために`constexpr`されていなかった多くの標準ライブラリ関数が、のちにコア言語機能が追加されて`constexpr`指定されている。
現時点で`constexpr`されていない関数は次のバージョンで`constexpr`になるかもしれず、よって現在使用されているバージョンである関数が`constexpr`ではないということを指摘することの意味は薄れている
そのため、現時点で`constexpr`ではない関数も次のバージョンで`constexpr`になるかもしれず、よって関数が`constexpr`指定されているだけでエラーにする意義は薄れてきた

以上を鑑みて、`constexpr`関数が定数式実行可能かどうかを判断するのは、実際に定数式内で実行されてからにした方がよいという結論に至った
以上から、コンパイル時に実行できない`constexpr`をエラーとするのは、実際にコンパイル時に呼びだされてからでよい、ということになった

実際に定数式内で実行できない関数が定数式内で呼び出された場合、これは従来通りエラーとするほかない。
しかし、定数式内で呼び出されていないのならば、定数式内で実行できない関数が存在していてもプログラムを不適格とはしない。
Expand Down

0 comments on commit d9744ca

Please sign in to comment.