C26418 NO_VALUE_OR_CONST_REF_SHARED_PTRC26418 NO_VALUE_OR_CONST_REF_SHARED_PTR

"Parâmetro de ponteiro compartilhado não é copiado ou movido."Shared pointer parameter is not copied or moved. Use T * ou T & em vez disso. "Use T* or T& instead."

Diretrizes de núcleos de C++: R.36: tirar um shared_ptr const& parâmetro expressar que ele pode manter uma contagem de referência para o objetoC++ Core Guidelines: R.36: Take a const shared_ptr& parameter to express that it might retain a reference count to the object

Se o parâmetro de ponteiro compartilhado é passado por valor ou referência a um objeto constante que é esperado que função assumirá o controle de tempo de vida do seu objeto de destino sem afetar do chamador.If shared pointer parameter is passed by value or reference to a constant object it is expected that function will take control of its target object’s lifetime without affecting of the caller. 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.The code should either copy or move the shared pointer parameter to another shared pointer object or pass it further to other code by invoking functions which accept shared pointers. Se isso não for o caso, em seguida, ponteiro simples ou uma referência pode ser viável.If this is not the case, then plain pointer or reference may be feasible.

ComentáriosRemarks

  • Essa verificação reconhece std::shared_pointer e tipos definidos pelo usuário que são provavelmente se comportam como ponteiros compartilhados.This check recognizes std::shared_pointer and user-defined types which are likely to behave like shared pointers. As seguintes características são esperadas para ponteiros compartilhados definida pelo usuário:The following traits are expected for user-defined shared pointers:
  • sobrecarregado desreferência ou membro acessar operadores (públicos e não excluído);overloaded dereference or member access operators (public and non-deleted);
  • Construtor de cópia ou operador de atribuição de cópia (público e não excluído);copy constructor or copy assignment operator (public and non-deleted);
  • destruidor público que não é excluído nem assume o padrão.public destructor which is neither deleted nor defaulted. Destruidores vazios ainda são contados como definido pelo usuário.Empty destructors are still counted as user-defined.

ExemploExample

complicativo interface desnecessáriosunnecessary interface complication

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

ExemploExample

complicativo interface desnecessário - simplificadounnecessary interface complication - simplified

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