Skip to content

Commit ed90ef4

Browse files
committed
C++26 : 「constexpr配置new」を追加 (close #1305)
1 parent c0bc234 commit ed90ef4

File tree

6 files changed

+57
-5
lines changed

6 files changed

+57
-5
lines changed

implementation-status.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@
309309
| P2795R5: [未初期化変数の読み取りをエラー性動作とする](/lang/cpp26/erroneous_behavior_for_uninitialized_reads.md) | 初期化されていない自動変数の読み取りの安全性を規定する | | | | |
310310
| P2573R2: [関数宣言を削除する理由を指定できるようにする](/lang/cpp26/delete_reason.md) | `f() = delete("reason");` | 15 | 19 | | |
311311
| P2893R3: [可変引数テンプレートで`friend`宣言をできるようにする](/lang/cpp26/variadic_friends.md) | クラステンプレートの可変引数テンプレートでまとめて`friend`宣言できるようにする | 15 | 20 | | |
312-
| P2747R2: [`constexpr`配置`new`](/lang/cpp26/constexpr_placement_new.md.nolink) | 定数式の文脈での配置`new`を許可 | 15 | 20 | | |
312+
| P2747R2: [`constexpr`配置`new`](/lang/cpp26/constexpr_placement_new.md) | 定数式の文脈での配置`new`を許可 | 15 | 20 | | |
313313
| P3144R2: [不完全型へのポインタに対する`delete`を不適格とする](/lang/cpp26/deleting_a_pointer_to_an_incomplete_type_should_be_ill-formed.md) | 未定義動作を引き起こす操作をコンパイルエラーとする | 15 | 19 | | |
314314
| P2963R3: [制約式内での畳み込み式の順序付け](/lang/cpp26/ordering_of_constraints_involving_fold_expressions.md.nolink) | 畳み込み式では全体ではなく個別の制約を原子制約式として扱う | | 19 | | |
315315
| P0963R3: [条件式での構造化束縛の使用を許可](/lang/cpp26/structured_binding_declaration_as_a_condition.md) | 式全体を`bool`値に変換できる場合に条件式で構造化束縛を使用できることとする | 15 | | | |

lang/cpp11/constexpr.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ GCC 5.2、Clang 3.7、Visual C++ 2015時点で、3つともデフォルトは512
217217
- [C++23 `constexpr`関数内で`consteval`関数を呼び出せない問題を軽減](/lang/cpp23/consteval_needs_to_propagate_up.md)
218218
- [C++26 定数評価での例外送出を許可](/lang/cpp26/allowing_exception_throwing_in_constant-evaluation.md)
219219
- [C++26 定数式での`void*`からポインタ型へのキャストを許可](/lang/cpp26/constexpr_cast_from_voidptr.md)
220+
- [C++26 `constexpr`配置`new`](/lang/cpp26/constexpr_placement_new.md)
220221
221222
222223
## 参照

lang/cpp26.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ C++26とは、2026年中に改訂される予定の、C++バージョンの通
7777
|----------|------|
7878
| [定数式での`void*`からポインタ型へのキャストを許可](/lang/cpp26/constexpr_cast_from_voidptr.md) | 型消去のために`void*`からポインタ型へのキャストを許可する |
7979
| [`static_assert`の診断メッセージにユーザーが生成した文字列の指定を許可](/lang/cpp26/user-generated_static_assert_messages.md) | `constexpr``S.size()``S.data()`メンバ関数をもつオブジェクトをコンパイル時文字列として指定できるようにする |
80-
| [`constexpr`配置`new`](/lang/cpp26/constexpr_placement_new.md.nolink) | 定数式の文脈での配置`new`を許可 |
80+
| [`constexpr`配置`new`](/lang/cpp26/constexpr_placement_new.md) | 定数式の文脈での配置`new`を許可 |
8181
| [`constexpr`構造化束縛の許可と、定数式への参照を定数式とする](/lang/cpp26/constexpr_structured_bindings_and_references_to_constexpr_variables.md.nolink) | 定数式に対する構造化束縛を許可し、関連する定数式への参照が定数式になるようにする |
8282
| [定数評価での例外送出を許可](/lang/cpp26/allowing_exception_throwing_in_constant-evaluation.md) | 定数式の文脈での例外の送出と捕捉を許可 |
8383

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# constexpr配置new [P2747R2]
2+
* cpp26[meta cpp]
3+
4+
<!-- start lang caution -->
5+
6+
このページはC++26に採用される見込みの言語機能の変更を解説しています。
7+
8+
のちのC++規格でさらに変更される場合があるため[関連項目](#relative-page)を参照してください。
9+
10+
<!-- last lang caution -->
11+
12+
## 概要
13+
C++26では、配置`new`構文を定数式の文脈で使用できるようになる。
14+
15+
```cpp
16+
template <class T, class... Args>
17+
constexpr void f(T* p, Args... args) {
18+
new (p) T(args...); // C++26: OK
19+
}
20+
```
21+
22+
C++20では、[`std::construct_at()`](/reference/memory/construct_at.md)関数が導入された。この関数には`constexpr`がついており、コンパイラが特別扱いすることによって、コンパイル時に配置`new`相当のことができた。
23+
24+
しかし、配置`new`構文と[`std::construct_at()`](/reference/memory/construct_at.md)では、できることに大きな差がある。
25+
26+
| 操作 | 配置`new` | `std::construct_at()` |
27+
|------|-----------|-----------------------|
28+
| 値初期化 | `new (p) T(args...)` | `std::construct_at(p, args...)` |
29+
| デフォルト初期化 | `new (p) T` | できない。`std::default_construct_at()`が提案されている |
30+
| リスト初期化 | `new (p) T{a, b}` | できない |
31+
| 指示付き初期化 | `new (p) T{.a=a, .b=b}` | できない。関数で表現する方法が現状ない |
32+
33+
これらの表現力の違いから、配置`new`構文自体が`constexpr`内で使用できることとなった。
34+
35+
関連して、[`<new>`](/reference/new.md)ライブラリの配置`new`演算子もまた、`constexpr`に対応する
36+
37+
38+
## <a id="relative-page" href="#relative-page">関連項目</a>
39+
- [C++11 constexpr](/lang/cpp11/constexpr.md)
40+
- [`new`演算子](/reference/new/op_new.md)
41+
- [`new[]`演算子](/reference/new/op_new[].md)
42+
43+
44+
## 参照
45+
- [P2747R2 constexpr placement new](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2747r2.html)

reference/new/op_new.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ void* operator new(std::size_t size, void* ptr) throw(); // (5) C++03
3939
void* operator new(std::size_t size, void* ptr) noexcept; // (5) C++11
4040
[[nodiscard]] void* operator new(std::size_t size,
4141
void* ptr) noexcept; // (5) C++20
42-
void* operator new(std::size_t size,
43-
void* ptr) noexcept; // (5) C++26
42+
constexpr void* operator new(std::size_t size,
43+
void* ptr) noexcept; // (5) C++26
4444
```
4545
* std::bad_alloc[link bad_alloc.md]
4646
* std::nothrow_t[link nothrow_t.md]
@@ -168,10 +168,13 @@ int main()
168168

169169
## 関連項目
170170
- [C++17 アライメント指定されたデータの動的メモリ確保](/lang/cpp17/dynamic_memory_allocation_for_over-aligned_data.md)
171+
- [C++26 `constexpr`配置`new`](/lang/cpp26/constexpr_placement_new.md)
171172

172173

173174
## 参照
174175
- [P0600R1 `[[nodiscard]]` in the Library](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0600r1.pdf)
175176
- C++20で`[[nodiscard]]`が付加された
176177
- [P2422R1 Remove `nodiscard` annotations from the standard library specification](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2422r1.html)
177178
- C++26で`[[nodiscard]]`指定が削除された
179+
- [P2747R2 constexpr placement new](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2747r2.html)
180+
- C++26で配置newのオーバーロードが`constexpr`対応した

reference/new/op_new[].md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void* operator new[](std::size_t size,
3939
void* operator new[](std::size_t size, void* ptr) throw(); // (5) C++03
4040
void* operator new[](std::size_t size, void* ptr) noexcept; // (5) C++11
4141
[[nodiscard]] void* operator new[](std::size_t size, void* ptr) noexcept; // (5) C++20
42-
void* operator new[](std::size_t size, void* ptr) noexcept; // (5) C++26
42+
constexpr void* operator new[](std::size_t size, void* ptr) noexcept; // (5) C++26
4343
```
4444
* std::bad_alloc[link bad_alloc.md]
4545
* std::nothrow_t[link nothrow_t.md]
@@ -168,10 +168,13 @@ int main()
168168

169169
## 関連項目
170170
- [C++17 アライメント指定されたデータの動的メモリ確保](/lang/cpp17/dynamic_memory_allocation_for_over-aligned_data.md)
171+
- [C++26 `constexpr`配置`new`](/lang/cpp26/constexpr_placement_new.md)
171172

172173

173174
## 参照
174175
- [P0600R1 `[[nodiscard]]` in the Library](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0600r1.pdf)
175176
- C++20で`[[nodiscard]]`が付加された
176177
- [P2422R1 Remove `nodiscard` annotations from the standard library specification](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2422r1.html)
177178
- C++26で`[[nodiscard]]`指定が削除された
179+
- [P2747R2 constexpr placement new](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2747r2.html)
180+
- C++26で配置newのオーバーロードが`constexpr`対応した

0 commit comments

Comments
 (0)