C26444 NO_UNNAMED_RAII_OBJECTSC26444 NO_UNNAMED_RAII_OBJECTS

Evite los objetos sin nombre con personalizado construcción y destrucción.Avoid unnamed objects with custom construction and destruction.

Directrices de núcleo de C++C++ Core Guidelines

ES.84: No (intente) declara una variable local sin nombreES.84: Don't (try to) declare a local variable with no name

Sin nombre (es decir, temporal) objetos con un comportamiento no trivial pueden señalar a cualquiera (a) código ineficaz que asigna y genera inmediatamente fuera recursos o (b) en el código que omite accidentalmente datos no primitivo.Unnamed (that is, temporary) objects with non-trivial behavior may point to either (a) inefficient code that allocates and immediately throws away resources or (b) to the code that unintentionally ignores non-primitive data. En ocasiones, también puede indicar declaración incorrecta con claridad.Sometimes it may also indicate plainly wrong declaration.

NotasNotes

  • Esta regla detecta los tipos con destructores no se han eliminado.This rule detects types with non-deleted destructors. Tenga en cuenta que los destructores pueden ser generados por el compilador.Keep in mind that destructors can be compiler generated.
  • La advertencia puede marcar el código que no es generada por el compilador y que invoca a un constructor no predeterminado de un tipo RAII o una función que devuelve un objeto de dicho tipo.The warning can flag code that is not compiler generated and that invokes either a non-default constructor of a RAII type or a function that returns an object of such type. Esta advertencia ayuda a detectar resultados de la llamada omite además de las declaraciones incorrectas.This warning helps to detect ignored call results in addition to wrong declarations.
  • La lógica de omite a temporales si se utilizan en expresiones de nivel superiores.The logic skips temporaries if they are used in higher-level expressions. Un ejemplo es objetos temporales que se pasan como argumentos o se utiliza para invocar un método.One example is temporaries that are passed as arguments or used to invoke a method.
  • La implementación de la biblioteca estándar puede tener distintas versiones de lógica de destrucción de algunos tipos (por ejemplo, contenedores).The standard library implementation may have different versions of destruction logic for some types (for example, containers). Esto puede producir advertencias con ruido en las compilaciones de depuración porque es habitual para pasar por alto los iteradores devueltos por llamadas como std::vector::insert.This can produce noisy warnings on debug builds because it is customary to ignore iterators returned from calls like std::vector::insert. Aunque tales advertencias no son útiles en la mayoría de los casos, son legítimos en señala el lugar donde se realiza algún trabajo no son evidentes en objetos temporales.While such warnings are not actionable in the majority of cases, they are legitimate in pointing to the place where some non-obvious work is done in temporary objects.

Ejemplo: Resultado de llamada omitidosExample: Ignored call result

std::string ToTraceMessage(State &state);
void SaveState(State &state)
{
    // ...
    ToTraceMessage(state); // C26444, should we do something with the result of this call?
}

Example: Ignored call result - fixed.
std::cerr << ToTraceMessage(state);

Example: Unexpected lifetime.
void SplitCache()
{
    gsl::finally([] { RestoreCache(); }); // C26444, RestoreCache is invoked immediately!
    //...
}

Example: Unexpected lifetime - fixed.
const auto _ = gsl::finally([] { RestoreCache(); });

Vea tambiénSee Also

ES.84: No (intente) declara una variable local sin nombreES.84: Don't (try to) declare a local variable with no name