他の質問で同じ答え (http://stackoverflow.com/questions/7058339/c-when-to-use-references-vs-pointers):
できる限り参照を使用し、必要な場合はポインタを使用してください。
できなくなるまでポインターを避けます。
その理由は、ポインターを使用すると、他の構成要素よりも追跡/読み取りが難しくなり、安全性が低下し、操作がはるかに危険になるためです。
したがって、経験則では、他に選択肢がない場合にのみポインターを使用します。
たとえば、オブジェクトへのポインターを返すことは、関数が場合によっては nullptr を返す可能性があり、それが想定される場合に有効なオプションです。そうは言っても、boost::optional に似たものを使用する方が良いでしょう。
もう 1 つの例は、特定のメモリ操作のために raw メモリへのポインタを使用することです。コードベース全体の危険な部分を制限するために、コードの非常に狭い部分に隠してローカライズする必要があります。
あなたの例では、ポインターをパラメーターとして使用しても意味がありません。
パラメータとして nullptr を指定すると、undefined-behaviour-land になります。参照属性のバージョンは、(トリックを簡単に見つけることができない限り)1の問題を許容しません。参照属性のバージョンは、ユーザーにとって理解しやすいです。nullになる可能性のあるものではなく、有効なオブジェクトを提供する必要があります。関数の動作が特定のオブジェクトの有無にかかわらず機能する必要がある場合、ポインターを属性として使用すると、 nullptr をパラメーターとして渡すことができ、関数には問題ありません。これは、ユーザーと実装コードの間の一種の契約です。