Skip to content

Commit

Permalink
背景とその他選択肢追記 #1117
Browse files Browse the repository at this point in the history
  • Loading branch information
onihusube committed Apr 19, 2023
1 parent 45cd04b commit 1c743fb
Showing 1 changed file with 17 additions and 3 deletions.
Expand Up @@ -369,15 +369,29 @@ unique_ptr<char[]> Stream::read() {

この例では、`reserve()``newbuf`及びそれを保存している`Vec::buf`の領域に`T[]``T`の配列型)と`char[]`のオブジェクトが暗黙的に構築され、同時に生存期間内にあることで、問題(配列オブジェクトを指さないポインタのイテレータとしての使用)は解消される。

ただし、`newbuf`及び`Vec::buf`から都度適切なオブジェクトへのポインタを得るのに[`std::launder()`](/reference/new/launder.md)を適切使用する必要がある
ただし、`newbuf`及び`Vec::buf`から都度適切なオブジェクトへのポインタを得るのに[`std::launder()`](/reference/new/launder.md)を適切に使用する必要がある

## この機能が必要になった背景・経緯
(執筆中)

例に上がっているようなコードはC言語では一般的な操作であり、Cでは問題がない。このようなコードはCとC++のコード共有部分でC++コードとして現れる可能性があり、その場合には未定義動作となる。

また、動的配列の例などは、`std::vector`の実装において問題となることで、そこは完全にC++のコードでありながらC++がサポートしてないことを行うことになってしまう。

これらの問題は、影響を受けるコードが多すぎるため実装はこれを最適化に用いたりはしないと考えられるため、実際には問題とならない可能性が高かった。しかし、これらのよく書かれているコードをC++がサポートしていないという奇妙な状況を改善するため、暗黙的なオブジェクト構築という仕様が導入された。

## 検討されたほかの選択肢
(執筆中)

上記の問題を解決するための方法として、暗黙的なオブジェクト構築以外に

- 問題となる操作を無条件で合法化
- ライブラリ関数を追加して、それを介してコンパイラに意図を伝達
- `std::span`を特別扱いして、関連する操作を合法化

などが考案されていた。

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

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

## 関連項目

Expand Down

0 comments on commit 1c743fb

Please sign in to comment.