Aviso C26418

O parâmetro de ponteiro compartilhado não é copiado nem movido. Em vez disso, use T* ou T& em vez disso.

Diretrizes principais do C++: R.36: Pegue um parâmetro const shared_ptr<widget>& para expressar que ele pode reter uma contagem de referência para o objeto

Se um parâmetro de ponteiro compartilhado for passado por valor ou por referência a um objeto constante, espera-se que a função assuma o controle do tempo de vida do objeto de destino sem afetar o chamador. O código deve copiar ou mover o parâmetro de ponteiro compartilhado para outro objeto de ponteiro compartilhado ou passá-lo para outro código invocando funções que aceitam ponteiros compartilhados. Caso contrário, um ponteiro ou referência simples pode ser viável.

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

complicação desnecessária da interface

template<class T>
std::string to_string(const std::shared_ptr<T> &e) // C26418, also C26415 SMART_PTR_NOT_NEEDED
{
    return !e ? null_string : e->to_string();
}

complicação desnecessária de interface – simplificada

template<class T>
std::string to_string(const T *e)
{
    return !e ? null_string : e->to_string();
}