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))
{}