Aviso C26417
O parâmetro de ponteiro compartilhado é passado por referência e não é redefinido nem reatribuído. Em vez disso, use T* ou T& em vez disso.
Diretrizes principais do C++: R.35: Pegue um parâmetro shared_ptr<widget>& 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, é mais seguro passar um ponteiro ou referência bruto, em vez de expor detalhes de gerenciamento de recursos.
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.
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 potencialmente 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());
// ...
}
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de