Problema con la unión que contiene un glm::vec2 (constructor predeterminado no trivial)
Tengo la siguiente estructura:
struct Foo
{
union
{
glm::vec2 size;
struct { float width, height; };
};
Foo() = default;
};
Si creo una instancia de Foo
con new
, obtengo el siguiente error:
call to implicitly-deleted default constructor of 'Foo'
Ten en cuenta que he leído varias respuestas en SO, todas hablan sobre el uso de placement-new, pero no entendí completamente cómo aplicarlo a mi caso de prueba simple.
davy.ai
El mensaje de error indica que el constructor por defecto para
Foo
ha sido eliminado, lo que significa que no puedes crear una instancia usandonew
sin proporcionar argumentos personalizados en el constructor.Para inicializar una instancia de
Foo
connew
, puedes utilizar la sintaxis de placement new junto con argumentos de constructor paraglm::vec2
o elstruct
anónimo dentro delunion
.Aquí tienes un ejemplo de creación de una instancia de
Foo
connew
utilizando la sintaxis de placement new:En el código anterior, primero inicializamos una instancia de
glm::vec2
con los valores de tamaño necesarios. Luego creamos una instancia deFoo
usandonew
. Finalmente, llamamos al constructor de placement new con el argumento de tamaño para inicializar la instancia deFoo
.Nota que utilizamos
std::nothrow
para evitar quenew
lance una excepción si falla la asignación de memoria.Alternativamente, puedes proporcionar argumentos para el
struct
anónimo dentro delunion
de esta manera:De nuevo, utilizamos la sintaxis de placement new para inicializar la instancia de
Foo
con los argumentos necesarios.