Aviso C26416
O parâmetro de ponteiro compartilhado é passado por referência de rvalue. Passe por valor, nesse caso.
Diretrizes Principais do C++: R.34: use um parâmetro shared_ptr<widget> para expressar que uma função é tem propriedade compartilhada
Passar um ponteiro compartilhado por referência de valor raramente é necessário. A menos que seja uma implementação da semântica de movimentação para um tipo de ponteiro compartilhado em si, os objetos de ponteiro compartilhado podem ser passados com segurança pelo valor. O uso da referência rvalue também pode ser uma indicação de que um ponteiro exclusivo é mais apropriado, pois ele transfere claramente a propriedade exclusiva do chamador para o computador chamado.
Comentários
Essa verificação reconhece
std::shared_pointer
e define o usuário tipos que provavelmente se comportarão como ponteiros compartilhados. As seguintes características são esperadas em ponteiros compartilhados definidos pelo usuário:operadores de acesso de membro ou de desreferência sobrecarregados (públicos e não excluídos);
um construtor de cópia ou operador de atribuição de cópia (público e não excluído);
um destruidor público que não é excluído nem definido como padrão. Destruidores vazios também são contados como definidos pelo usuário.
Exemplos
Otimização de construtor questionável:
action::action(std::shared_ptr<transaction> &&t) noexcept // C26416
: transaction_(std::move(t))
{}
action::action(std::shared_ptr<transaction> &t) noexcept // also C26417 LVALUE_REF_SHARED_PTR
: transaction_(t)
{}
Otimização de construtor questionável - simplificada:
action::action(std::shared_ptr<transaction> t) noexcept
: transaction_(std::move(t))
{}