• 基本型(C++)や列挙型など、コピーが安価な型は値渡しが使いやすい。
  • コピーコストが高い型は、読み取り専用なら const 参照、変更するなら非 const 参照がよく使われる。

値渡しが向く場合

  • 基本型や列挙型など、コピーが安価な型
  • std::string_viewstd::span などの軽量な view 型
  • イテレータや std::reference_wrapper など、ポインタや参照に近い軽量な型

参照渡しが向く場合

  • 引数を関数内で変更する必要がある場合
  • std::ostream などのコピーできない型
  • std::unique_ptrstd::shared_ptr など、所有権や参照カウントが関わる型
  • 継承関係があり、オブジェクトスライシングを避けたい場合

補足

T について sizeof(T) <= 2 * sizeof(void*) くらいなら、値渡しでも十分安価なことが多い。

参考