回答編集履歴

4

逆参照は間接参照とも…

2019/09/15 15:06

投稿

raccy
raccy

スコア21735

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

文が変だった

2019/09/15 15:06

投稿

raccy
raccy

スコア21735

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)は未定義動作になるため、該当の部分の前でチェックしておく必要す。二つの違いは「だれが`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
2
 
3
3
 
4
4
 

2

感じにする

2019/09/15 06:19

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
 
22
22
 
23
- 等が考えられ、あらかじめ決めておきます。そして、3.の未定義動作を除けば、関数ないで`nullptr`であるかをチェックして、あらかじめ決めておいた動作をする必要があるでしょう。
23
+ 等が考えられ、あらかじめ決めておきます。そして、3.の未定義動作を除けば、関数で`nullptr`であるかをチェックして、あらかじめ決めておいた動作をする必要があるでしょう。
24
24
 
25
25
 
26
26
 

1

誤字の修正

2019/09/15 02:22

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- 関数側が`nullptr`が来ることを想定しておかなければなりません。`nullptr`が渡された場合どのようなどうさするのか、例えば、
9
+ 関数側が`nullptr`が来ることを想定しておかなければなりません。`nullptr`が渡された場合どのような動作をするのか、例えば、
10
10
 
11
11
 
12
12