Aviso C26417
O parâmetro de ponteiro compartilhado é passado por referência e não é redefinido nem reatribuído. Use T* ou T& em vez disso.
Diretrizes principais do C++: R.35: Pegue um parâmetro widget& shared_ptr<> para expressar que uma função pode recolocar o ponteiro compartilhado
Passar ponteiros compartilhados por referência pode ser útil em cenários em que o código chamado atualiza o destino do objeto de ponteiro inteligente e seu chamador espera ver essas atualizações. Usar uma referência exclusivamente para reduzir os custos da passagem de um ponteiro compartilhado é questionável. Se o código chamado acessar apenas o objeto de destino e nunca gerenciar seu tempo de vida, será mais seguro passar um ponteiro ou referência bruta, em vez de expor detalhes de gerenciamento de recursos.
Comentários
Essa verificação reconhece
std::shared_pointer
os tipos definidos pelo usuário 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.
A ação de redefinição ou reatribuição é interpretada de maneira mais genérica:
qualquer chamada para uma função não constante em um ponteiro compartilhado tem o potencial de redefinir o ponteiro;
Qualquer chamada para uma função que aceite uma referência a um ponteiro compartilhado não constante pode redefinir ou reatribuir esse ponteiro.
Exemplos
complicação desnecessária da interface
bool unregister(std::shared_ptr<event> &e) // C26417, also C26415 SMART_PTR_NOT_NEEDED
{
return e && events_.erase(e->id());
}
void renew(std::shared_ptr<event> &e)
{
if (unregister(e))
e = std::make_shared<event>(e->id());
// ...
}
complicação desnecessária de interface – simplificada
bool unregister(const event *e)
{
return e && events_.erase(e->id());
}
void renew(std::shared_ptr<event> &e)
{
if (unregister(e.get()))
e = std::make_shared<event>(e->id());
// ...
}