回答編集履歴
4
逆参照は間接参照とも…
test
CHANGED
@@ -1,4 +1,8 @@
|
|
1
|
-
いいえ、[ヌルポインタの逆参照](https://ja.cppreference.com/w/cpp/language/ub#.E3.83.8C.E3.83.AB.E3.83.9D.E3.82.A4.E3.83.B3.E3.82.BF.E3.81.AE.E9.80.86.E5.8F.82.E7.85.A7)は未定義動作になるため、該当の部分の前でチェックしておく必要があります。二つの違いは「だれが`nullptr`の場合を担保するのか?」です。
|
1
|
+
いいえ、[ヌルポインタの逆参照(間接参照)](https://ja.cppreference.com/w/cpp/language/ub#.E3.83.8C.E3.83.AB.E3.83.9D.E3.82.A4.E3.83.B3.E3.82.BF.E3.81.AE.E9.80.86.E5.8F.82.E7.85.A7)は未定義動作になるため、該当の部分の前でチェックしておく必要があります。二つの違いは「だれが`nullptr`の場合を担保するのか?」です。
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
※ 逆参照"dereference"(間接参照"indirection"とも呼ばれる)と参照渡しにおける左辺値参照"lvalue reference"は全く別の概念であり、混合してはいけません。
|
2
6
|
|
3
7
|
|
4
8
|
|
@@ -36,7 +40,7 @@
|
|
36
40
|
|
37
41
|
|
38
42
|
|
39
|
-
さて、呼び出し側はどうかと言うことです。呼び出し側もチェックする必要は無いように思います。しかし、もともとポインタであった物を渡したい場合、逆参照して通常のオブジェクトとして渡す必要があります。質問のコードの`*pRet`の部分ですね。ポインタを逆参照するとき、そのポインタが`nullptr`ではないことを保証するのは、逆参照を書いている側です。つまり、呼び出し側で`*pRet`が安全に使えるかを確認しておく必要があります。結局の所、コード全体ではどこかでチェックは必要になると言うことです。
|
43
|
+
さて、呼び出し側はどうかと言うことです。呼び出し側もチェックする必要は無いように思います。しかし、もともとポインタであった物を渡したい場合、逆参照して通常のオブジェクトとして渡す必要があります。質問のコードの`*pRet`の部分ですね。ポインタを逆参照(間接参照)するとき、そのポインタが`nullptr`ではないことを保証するのは、逆参照(間接参照)を書いている側です。つまり、呼び出し側で`*pRet`が安全に使えるかを確認しておく必要があります。結局の所、コード全体ではどこかでチェックは必要になると言うことです。
|
40
44
|
|
41
45
|
|
42
46
|
|
3
文が変だった
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
いいえ、[ヌルポインタの逆参照](https://ja.cppreference.com/w/cpp/language/ub#.E3.83.8C.E3.83.AB.E3.83.9D.E3.82.A4.E3.83.B3.E3.82.BF.E3.81.AE.E9.80.86.E5.8F.82.E7.85.A7)は未定義動作になるため、該当の部分の前でチェックしておく必要
|
1
|
+
いいえ、[ヌルポインタの逆参照](https://ja.cppreference.com/w/cpp/language/ub#.E3.83.8C.E3.83.AB.E3.83.9D.E3.82.A4.E3.83.B3.E3.82.BF.E3.81.AE.E9.80.86.E5.8F.82.E7.85.A7)は未定義動作になるため、該当の部分の前でチェックしておく必要があります。二つの違いは「だれが`nullptr`の場合を担保するのか?」です。
|
2
2
|
|
3
3
|
|
4
4
|
|
2
感じにする
test
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
|
21
21
|
|
22
22
|
|
23
|
-
等が考えられ、あらかじめ決めておきます。そして、3.の未定義動作を除けば、関数
|
23
|
+
等が考えられ、あらかじめ決めておきます。そして、3.の未定義動作を除けば、関数内で`nullptr`であるかをチェックして、あらかじめ決めておいた動作をする必要があるでしょう。
|
24
24
|
|
25
25
|
|
26
26
|
|
1
誤字の修正
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
|
8
8
|
|
9
|
-
関数側が`nullptr`が来ることを想定しておかなければなりません。`nullptr`が渡された場合どのような
|
9
|
+
関数側が`nullptr`が来ることを想定しておかなければなりません。`nullptr`が渡された場合どのような動作をするのか、例えば、
|
10
10
|
|
11
11
|
|
12
12
|
|