Compartilhar via


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());
    // ...
}