Partilhar via


Aviso C26416

O parâmetro de ponteiro compartilhado é passado pela referência rvalue. Em vez disso, passe pelo valor.

Diretrizes principais do C++: R.34: Utilize um parâmetro shared_ptr<widget> para expressar propriedade compartilhada

Passar um ponteiro compartilhado por referência de rvalue raramente é necessário. A menos que seja uma implementação da semântica de movimento para um tipo de ponteiro compartilhado em si, os objetos de ponteiro compartilhados podem ser passados com segurança pelo valor. O uso de referência rvalue também pode ser uma indicação de que um ponteiro único é mais apropriado, uma vez que transfere claramente a propriedade exclusiva do chamador para o destinatário.

Observações

  • Esta verificação reconhece std::shared_pointer e tipos definidos por utilizador que provavelmente se comportarão como ponteiros partilhados. As seguintes características são esperadas para ponteiros compartilhados definidos pelo usuário:

  • operadores de desreferenciação ou acesso de membros sobrecarregados (públicos e não excluídos);

  • um construtor de cópias ou um operador de atribuição de cópias (público e não excluído);

  • um destrutor público que não é eliminado ou predefinido. Os destrutores vazios ainda são contados como definidos pelo utilizador.

Exemplos

Otimização questionável do construtor:

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 questionável do construtor - simplificada:

action::action(std::shared_ptr<transaction> t) noexcept
    : transaction_(std::move(t))
{}