Compartir vía


Advertencia C26410

El parámetro 'parameter' es una referencia al puntero único const, use const T* o const T& en su lugar (r.32)

Por lo general, las referencias al puntero único const no tienen sentido. Se pueden reemplazar de forma segura por una referencia o un puntero básicos. Esta advertencia exige la regla R.32 de C++ Core Guidelines.

Comentarios

  • Las comprobaciones de punteros únicos tienen criterios bastante amplios para identificar punteros inteligentes. La regla R.31 de C++ Core Guidelines: Si tiene punteros inteligentes que no son std, siga el patrón básico de std que describe los conceptos de puntero único y puntero compartido. La heurística es sencilla, pero puede provocar sorpresas: un tipo de puntero inteligente es cualquier tipo que defina o operator->operator*. Un tipo capaz de copiar (puntero compartido) debe tener un constructor de copia público o un operador de asignación sobrecargado que trate con un parámetro de referencia que no sea Rvalue.

  • El código de plantilla puede generar advertencias ruidosas. Tenga en cuenta que se pueden crear instancias de plantillas con varios parámetros de tipo con distintos niveles de direccionamiento indirecto, incluidas las referencias. Puede que algunas advertencias no sean obvias y que las correcciones requieran cierto rediseño de las plantillas (por ejemplo, la eliminación explícita del direccionamiento indirecto de referencia). Si el código de plantilla es genérico intencionadamente, se puede suprimir la advertencia.

Nombre del análisis de código: NO_REF_TO_CONST_UNIQUE_PTR

Ejemplo

Referencia innecesaria:

std::vector<std::unique_ptr<Tree>> roots = GetRoots();
std::for_each(
    roots.begin(),
    roots.end(),
    [](const auto &root) { Rebalance(root.get()); });   // C26410