From 44ce2423fe44bad90a3937cc11b6be83e14fcfac Mon Sep 17 00:00:00 2001 From: onihusube <44743040+onihusube@users.noreply.github.com> Date: Mon, 6 Feb 2023 15:05:22 +0900 Subject: [PATCH] =?UTF-8?q?to=5Faddress=20:=20=E3=82=A4=E3=83=86=E3=83=AC?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E3=81=8B=E3=82=89=E3=83=9D=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E3=82=BF=E3=81=B8=E3=81=AE=E5=A4=89=E6=8F=9B=E4=BE=8B=E3=81=AE?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/memory/to_address.md | 39 +++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/reference/memory/to_address.md b/reference/memory/to_address.md index a301c42f87..98a1321d37 100644 --- a/reference/memory/to_address.md +++ b/reference/memory/to_address.md @@ -32,6 +32,9 @@ namespace std { ## 例 + +### ポインタの例 + ```cpp example #include #include @@ -55,12 +58,46 @@ int main() ``` * std::to_address[color ff0000] -### 出力 +#### 出力 ``` 3 1 ``` +### イテレータの例 + +```cpp example +#include +#include + +int main() +{ + std::vector vec = {1, 2, 3, 4}; + + // vectorやstring等のイテレータはcontiguousではあるが、実装によってポインタではない場合がある + auto it = vec.begin(); + auto end = vec.end(); + + // contiguousなイテレータをその要素へのポインタに変換する + int* p = std::to_address(it); + + // 特に、終端イテレータからポインタへの変換で未定義動作を回避できる + int* ep = std::to_address(end); + // この様にしてしまうと、オブジェクトを指していないポインタのデリファレンスとなり未定義動作 + //int* ep = &*end; + + std::cout << *p << '\n'; + std::cout << *(ep - 1); +} +``` +* std::to_address[color ff0000] + +#### 出力 +``` +1 +4 +``` + ## バージョン ### 言語 - C++20