tuto try operator dev const_cast cast c++ casting

c++ - try - ¿Cuándo los moldes llaman al constructor del nuevo tipo?



int to string c++ (3)

¿Cuáles son las reglas para determinar si un static_cast en particular llamará o no al constructor de una clase? ¿Qué tal el estilo C / estilo funcional?


Se llama a un constructor para un tipo de clase cada vez que se crea una nueva instancia de ese tipo. Si un elenco crea un nuevo objeto de ese tipo de clase, se llama a un constructor. La resolución de sobrecarga determina cuál de los constructores para un tipo de clase se llama dado argumentos particulares.

Si el tipo de destino de un static_cast es un tipo de clase, creará un nuevo objeto del tipo de destino.

Un const_cast , dynamic_cast o reinterpret_cast nunca creará un nuevo objeto de clase, y por lo tanto nunca llamará a un constructor.

Como un elenco de estilo C siempre realiza una combinación de static_cast , const_cast y reinterpret_cast , creará un nuevo objeto en las mismas circunstancias en que static_cast crearía un nuevo objeto.


Si hay un constructor de conversiones adecuado, el constructor de conversiones será llamado por static_cast :

class Class { public: Class( int ); //<< conversion constructor }; int what = 0; Class object = static_cast<Class>( what );

lo mismo se aplica a los moldes de estilo C y los moldes "funcionales".

int what = 0; Class object = (Class)what; int what = 0; Class object = Class( what );


Cada vez que se crea un objeto nuevo, se llama a un constructor. Un static_cast siempre da como resultado un nuevo objeto temporal (pero vea el comentario de James McNellis) ya sea inmediatamente o mediante una llamada a una conversión definida por el usuario. (Pero para devolver un objeto del tipo deseado, el operador de conversión definido por el usuario tendrá que llamar a un constructor).

Cuando el destino es un tipo de clase, los moldes de estilo C y los moldes de estilo funcional con un solo argumento son, por definición, los mismos que un static_cast . Si el molde de estilo funcional tiene cero o más de un argumento, llamará inmediatamente al constructor; los operadores de conversión definidos por el usuario no se consideran en este caso. (Y uno podría cuestionar la elección de llamar a esto una "conversión de tipo").

Para el registro, un caso en el que un operador de conversión definido por el usuario podría ser llamado:

class A { int m_value; public A( int initialValue ) : m_value( initialValue ) {} }; class B { int m_value; public: B( int initialValue ) : m_value( initialValue ) {} operator A() const { return A( m_value ); } }; void f( A const& arg ); B someB; f( static_cast<A>( arg ) );

En este caso particular, el elenco es innecesario, y la conversión se hará implícitamente en su ausencia. Pero en todos los casos: conversión implícita, static_cast , conversión de estilo C ( (A) someB ) o (A) someB estilo funcional ( A( someB ) B::operator A() A( someB ) ), se A( someB ) B::operator A() .