Skip to content

Commit

Permalink
未初期化領域への暗黙的なオブジェクト構築 : 微修正 #1117
Browse files Browse the repository at this point in the history
  • Loading branch information
onihusube committed Apr 26, 2023
1 parent 5f8fea3 commit 629ccda
Showing 1 changed file with 4 additions and 4 deletions.
Expand Up @@ -348,7 +348,7 @@ void process(Stream *stream) {
}
```
`Foo`も`Bar`も*implicit-lifetime types*だとして、以前のこのコードに対して`Stream::read()`が次のように実装されている場合
`Foo`も`Bar`も*implicit-lifetime types*だとして、このコードに対して`Stream::read()`が次のように実装されている場合
```cpp
unique_ptr<char[]> Stream::read() {
Expand All @@ -363,7 +363,7 @@ unique_ptr<char[]> Stream::read() {

ただし、`process()`内の各分岐においては、返された`buffer`ポインタ(`char(*)[]`)からそれぞれの場合で適切なオブジェクト(`Foo`/`Bar`)へのポインタを、[`std::launder()`](/reference/new/launder.md)を用いて取得する必要がある。

`reinterpret_cast`はポインタ型の変換のみを行うが、型変換だけではそのポインタはその領域に生存期間内にあるオブジェクトと必ずしもリンクしない`std::launder()`は、渡されたポインタの領域で生存期間内にあるオブジェクトへのポインタを生成して返す関数であり、これを用いることで暗黙的に構築されたオブジェクトへの適切なポインタを得ることができる。
`reinterpret_cast`はポインタ型の変換のみを行うが、型変換だけではそのポインタはその領域で生存期間内にあるオブジェクトと必ずしもリンクしない`std::launder()`は、渡されたポインタの領域で生存期間内にあるオブジェクトへのポインタを生成して返す関数であり、これを用いることで暗黙的に構築されたオブジェクトへの適切なポインタを得ることができる。

### 動的配列の実装

Expand All @@ -389,9 +389,9 @@ unique_ptr<char[]> Stream::read() {

などが考案されていた。

最終的には、暗黙的なオブジェクト構築のように、C++のオブジェクトモデルを修正する形でこの問題を解消することになった
最終的には、C++のオブジェクトモデルを修正する暗黙的なオブジェクト構築によってこの問題を解消することになった

ただし、2番目の特殊なライブラリ関数もC++23で`std::start_lifetime_as()`として追加されている。
なお、2番目の特殊なライブラリ関数もC++23で`std::start_lifetime_as()`として追加されている。

## 関連項目

Expand Down

0 comments on commit 629ccda

Please sign in to comment.