爺感:参照/ポインター引数と変更
爺感:なんだか作法がわからん - 檜山正幸のキマイラ飼育記 メモ編
参照を渡すのは書き換えるためだと思うのだがなー。書き換えない意図こそconstで示すべきじゃないの。
「変更するならポインターを渡す」という人はけっこういるようだ。
参照をもらって、参照先を変更する関数を foo(r) とすると、foo() を呼び出す側では、引数が参照として渡っているのか、それとも実体のコピーかが区別しにくい。実体のコピーが関数側に行くなら、変更なんてあり得ないわけだ。
で、呼び出し構文を見て「あー、これは変更されないな」と誤解される危険を避けるためにポインターにする、と。
まー、言ってることは分かるが、ポインターだってconst付いていれば変更される心配はないので、「参照かポインターか」じゃなくて「constがあるかないか」だと思う。ポインターだから必ず変更する、なんてことはないもんね。
というわけで、僕は「指してる先を変更するか/しないか」でポインター/参照を使い分ける気はないな。
基本的に参照でいいときは参照を使う、だろう(これがジジイには難しい)。ポインターにするのは、既にポインターが使われているとき(これは多い)か、nullptrが必要なときだろう。
ライブラリや既存コードがポインターベースなら、それはしょうがない。ポインターでやりましょ、ってことだ。
引数にnullを渡す、あるいは関数からnullを戻す、ってならポインターしかない。だが、nullを避けられそうなら参照にすべき。いわゆる「出力引数」なんてのは、悪しき習慣かも知れないがイッパイ使っているからね、しょうがない(ポインターでも参照でも出力引数は出来る)。
それと、さらに、コピー埋め込み方式のデメリット - 檜山正幸のキマイラ飼育記 メモ編で書いたように、ポインターを忌避すると、ロクでもないことになったりする。