回答編集履歴
3
update
test
CHANGED
@@ -57,3 +57,53 @@
|
|
57
57
|
> Otherwise, such a pointer refers to allocated storage [...]
|
58
58
|
|
59
59
|
> Indirection through such a pointer is permitted but [...]
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
Exampleの解釈としては:
|
64
|
+
|
65
|
+
```C++
|
66
|
+
|
67
|
+
void B::mutate() {
|
68
|
+
|
69
|
+
new (this) D2; // reuses storage — ends the lifetime of *this
|
70
|
+
|
71
|
+
f(); // undefined behavior
|
72
|
+
|
73
|
+
// this->f(); つまり非staticメンバ関数呼び出し
|
74
|
+
|
75
|
+
// 条件(6.2)に該当するためundefined behavior
|
76
|
+
|
77
|
+
... = this; // OK, this points to valid memory
|
78
|
+
|
79
|
+
// ポインタ値 this の利用はOK(Otherwise~の文)
|
80
|
+
|
81
|
+
}
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
void g() {
|
86
|
+
|
87
|
+
void* p = std::malloc(sizeof(D1) + sizeof(D2));
|
88
|
+
|
89
|
+
B* pb = new (p) D1;
|
90
|
+
|
91
|
+
pb->mutate();
|
92
|
+
|
93
|
+
*pb; // OK: pb points to valid memory
|
94
|
+
|
95
|
+
// 条件(6.1)~(6.5)いずれも該当せずOK(Indirection~の文)
|
96
|
+
|
97
|
+
void* q = pb; // OK: pb points to valid memory
|
98
|
+
|
99
|
+
// ポインタ値 pb をvoid*と扱うのはOK(Otherwise~の文)
|
100
|
+
|
101
|
+
pb->f(); // undefined behavior, lifetime of *pb has ended
|
102
|
+
|
103
|
+
// pb->f(); は非staticメンバ関数呼び出し
|
104
|
+
|
105
|
+
// 条件(6.2)に該当するためundefined behavior
|
106
|
+
|
107
|
+
}
|
108
|
+
|
109
|
+
```
|
2
refinement
test
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
近い概念としては、「あるオブジェクト#1の生存期間(lifetime)が終了したあとに、同オブジェクト#1が占めていたストレージ上に
|
19
|
+
近い概念としては、「あるオブジェクト#1の生存期間(lifetime)が終了したあとに、同オブジェクト#1が占めていたストレージ上にオブジェクト#2が生成されている、その同ストレージへのポインタ」でしょうか。
|
20
20
|
|
21
21
|
|
22
22
|
|
1
update
test
CHANGED
@@ -13,10 +13,6 @@
|
|
13
13
|
- 生成(construction)から破壊(destruction)されるまでの 生存期間(lifetime) では、一定のストレージ(storage)を占有します。
|
14
14
|
|
15
15
|
- 名前(name) を付けられます。("名無しのオブジェクト"もあります)
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
つまり「lifetime が終了し、かつ storage が他のオブジェクトによって再利用されたオブジェクト」はそもそも存在えしません。
|
20
16
|
|
21
17
|
|
22
18
|
|
@@ -44,7 +40,7 @@
|
|
44
40
|
|
45
41
|
> (主語)
|
46
42
|
|
47
|
-
>
|
43
|
+
> **any pointer that represents the address of the storage location** where the object will be or was located
|
48
44
|
|
49
45
|
> (述語)
|
50
46
|
|