2011-07-23 16 views
20

así que estaba buscando a través de algún código fuente impulso y encontré esto:¿Por qué boost :: checked_delete "intencionalmente complejo"?

(de <boost/checked_delete.hpp>)

template<class T> inline void checked_delete(T * x) 
{ 
    // intentionally complex - simplification causes regressions 
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; 
    (void) sizeof(type_must_be_complete); 
    delete x; 
} 

Cualquiera que suceda a saber por qué se lleva a cabo de esta manera? ¿No sería suficiente con sizeof (T) (por ejemplo)?

+0

Buena pregunta :) –

Respuesta

20

Someone asked the same question earlier. Este post escrito por Peter Dimov (one of the writers de boost/checked_delete.hpp) más o menos habla por sí mismo:

  • ¿Cuál es el resultado de aplicar sizeof a un tipo incompleto?

un error en tiempo de compilación, a menos que el compilador decide volver 0 como una extensión no estándar .

  • ¿Por qué se llama sizeof dos veces?

El segundo sizeof es una solución para un error Metrowerks CodeWarrior en cual el primer typeof no se instancia a no ser utilizado.

  • ¿Por qué es el resultado de yeso sizeof de orinar? ¿Qué hace exactamente eso línea hacer?

Silencia una advertencia del compilador.

+0

Doh! Batir mis poderes psíquicos por un minuto! Aún así, es bueno saber que mi conjetura fue bastante precisa :-) – Praetorian

+0

@Praetorian: tenía la misma sospecha sobre el 'sizeof (T)? 1: -1 expresión, pero quería obtenerlo directamente de (uno de los) autores mismos. :-) –

+2

Muy bonito, bien hecho. –

3

Esto es solo una suposición; pero puede haber compiladores que acaban de emitir una advertencia cuando escribe sizeof(incomplete_type) y devuelve 0. Así que se está asegurando de que la declaración de matriz falle en ese caso al tratar de declarar una matriz de tamaño -1.

Cuestiones relacionadas