Este protocolo é uma nota para eu não esquecer:
Usando a string como um id (não será modificado). Passá-lo por referência const é provavelmente a melhor ideia aqui: (std :: string const &)
Modificando a string, mas não querendo que o chamador veja essa mudança. Passá-lo por valor é preferÃvel: (std :: string)
Modificando a string, mas querendo que o chamador veja a mudança. Passá-lo por referência é preferÃvel: (std :: string &)
Enviar a string para a função e o chamador da função nunca mais usará a string. Usar a semântica de movimento pode ser uma opção (std :: string &&)