値渡しが向く場合
- 基本型や列挙型など、コピーが安価な型
std::string_viewやstd::spanなどの軽量な view 型- イテレータや
std::reference_wrapperなど、ポインタや参照に近い軽量な型
参照渡しが向く場合
- 引数を関数内で変更する必要がある場合
std::ostreamなどのコピーできない型std::unique_ptrやstd::shared_ptrなど、所有権や参照カウントが関わる型- 継承関係があり、オブジェクトスライシングを避けたい場合
補足
型 T について sizeof(T) <= 2 * sizeof(void*) くらいなら、値渡しでも十分安価なことが多い。