es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Significado de “declaración mal formada” en L(n)

Un fragmento de código de cppreference.com es así:

struct M { };
struct L { L(M&); };

M n;
void f() {
M(m); // declaración, equivalente a M m;
L(n); // declaración mal formada
L(l)(m); // aún es una declaración
}

“L(n);” está comentado con “declaración mal formada”. Pero casi todos los compiladores emiten un mensaje como este: no existe un constructor predeterminado para la clase “L”. Es decir, no se considera mal formado, ¿verdad? Porque si lanzo una línea “L() = default;” en el cuerpo de L, se compila correctamente.

¿Está equivocado o es engañoso el comentario o los compiladores no cumplen estrictamente con el estándar?

Seguimiento:

Parece que he cometido un error con “mal formado”:

mal formado – el programa tiene errores de sintaxis o errores semánticos diagnosables. Se requiere que un compilador de C++ conforme emita un diagnóstico, incluso si define una extensión de lenguaje que asigna significado a dicho código (como con matrices de longitud variable). El texto del estándar utiliza “shall”, “shall not” y “ill-formed” para indicar estos requisitos.

A la luz de eso, esa línea es semánticamente incorrecta.

Gracias por sus respuestas y comentarios.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El comentario “declaración mal formada” es técnicamente correcto, ya que viola las reglas de la inicialización directa. Según el estándar de C++, la inicialización directa solo permite el uso de un conjunto de paréntesis para pasar argumentos a constructores. En la líneaL(n);, los paréntesis alrededor de n se están utilizando para pasar argumentos, pero no existe un constructor coincidente que tome una referencia de M como argumento. Esto viola las reglas de la inicialización directa, de ahí el comentario.

    Sin embargo, como se señala en la continuación, el programa no es estrictamente mal formado, ya que se compila con éxito con la adición deL() = default; en el constructor de L. Esto significa que algunos compiladores pueden ser indulgentes con este error de sintaxis y proporcionar un comportamiento no estándar. Por lo tanto, es importante tener en cuenta que depender de tal comportamiento no estándar puede conducir a resultados inesperados en diferentes entornos.

Comments are closed.