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