Partilhar via


Aviso C26418

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

Diretrizes principais do C++: R.36: Utilize um parâmetro const shared_ptr<widget>& para indicar que ele pode manter uma contagem de referências ao 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.

Observações

  • Esta verificação reconhece std::shared_pointer e tipos definidos por utilizador que provavelmente se comportarão como ponteiros partilhados. As seguintes características são esperadas para ponteiros compartilhados definidos pelo usuário:

  • operadores de desreferenciação ou acesso de membros sobrecarregados (públicos e não excluídos);

  • um construtor de cópias ou um operador de atribuição de cópias (público e não excluído);

  • um destrutor público que não é eliminado ou predefinido. Os destrutores vazios ainda são contados como definidos pelo utilizador.

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 de interface desnecessária - simplificada

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