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.

¿Por qué no se compila este código? La reasignación de un tipo específico de estructura en el interior de una lambda provoca el error C2512: no hay ningún constructor predeterminado disponible apropiado.

Tengo una estructura con 2 miembros, depende del primer miembro para calcular el valor del segundo.

struct SomeStruct
{
   int memberA = 0;
   int miembroB = memberA + 5;
};

int main()
{
   auto SomeLambda = []
   {
      SomeStruct x;
      x = SomeStruct{};
   };

   SomeStruct x;
   x = SomeStruct{};
   return 0;
}

Quiero reasignar esa estructura para reinicializarla y reutilizar el nombre de la variable. Puedo hacer esto en una función regular, PERO si lo hago dentro de una lambda obtengo el siguiente error de compilación.

main.cpp (12): error C2512: & # 39; SomeStruct & amp; # 39;: no hay un constructor predeterminado apropiado disponible
main.cpp (12): nota: inicialización de un agregado no válida

Si elimino la dependencia interna entre los miembros, el código se compila sin problemas.

struct SomeStruct
{
   int memberA = 0;
   int memberB = 5;
};

Si cambio la asignación dentro de la lambda para usar paréntesis en lugar de llaves, eso también permite que el código se compile.

SomeStruct x;
x = SomeStruct ();

Sin embargo, la asignación fuera de la lambda todavía está usando llaves.

¿Alguien puede decirme por qué esta asignación de un tipo específico de estructura dentro de una lambda no se compila en MSVC?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error de compilación ocurre porque la estructura SomeStruct no tiene un constructor predeterminado adecuado disponible. En este caso, se necesita el constructor predeterminado porque cuando se ejecuta la lambda, intenta crear una instancia de SomeStruct utilizando inicialización de agregados, lo que requiere un constructor predeterminado.

    Una forma de solucionar este problema es proporcionar explícitamente un constructor predeterminado para la estructura:

    struct SomeStruct
    {
       int memberA = 0;
       int memberB = memberA + 5;
       SomeStruct() = default;
    };
    

    Alternativamente, como se menciona en la pregunta, al utilizar paréntesis para la asignación dentro de la lambda, se resuelve el problema sin requerir un constructor predeterminado:

    auto SomeLambda = []()
    {
       SomeStruct x;
       x = SomeStruct();
    };
    

    Esto se debe a que al utilizar paréntesis, la asignación se realiza utilizando el constructor de copia, que existe implícitamente para SomeStruct.

Comments are closed.