2010-12-03 11 views
10

estoy usando el siguiente compilador:¿Por qué este código hace que el compilador de VC++ falle?

Microsoft Visual C++ 2010

El siguiente código se bloquea el compilador cuando se compila:

template<class T_> 
void crasher(T_ a, decltype(*a)* dummy = 0){} 

int main() 
{ 
    crasher(0); 
    return 0; 
} 

decltype(*a)* utilizado para hacer cumplir T_ para ser un tipo de puntero, como char*, int* y shared_ptr<int>.

¿Por qué se cuelga? ¿Es esto un error conocido?

+0

¿Qué versión de VC++? VC++ se niega a compilar esto. – sharptooth

+0

@sharptooth: La versión del compilador es: Microsoft Visual C++ 2010 – xmllmx

+0

funciona bien sin 'decltype'? –

Respuesta

0

La plantilla no es válida para la instanciación de T_=int porque el prefijo operator* es una falla de sustitución, por lo que debería fallar de alguna manera, aunque sin fallar, por supuesto.

0

Simplemente no entiendo por qué escribes decltype (* a) * en lugar de decltype (a). Como 0 (cero) es int por defecto, la expresión decltype (a) también será int. Si quiere que var dummy sea un puntero a decltype (a), entonces debe escribir decltype (a) *. De esta manera, dummy será de tipo int *. También debe considerar las conversiones de tipo. 0 puede convertir a int *. No estoy seguro de que funcione para todos los tipos.

2

Asumiendo que su objetivo es

decltype(*a)* utilizado para hacer cumplir T_ ser un tipo de puntero similar - como char*, int *, y shared_ptr.

... Lo que necesita es simple plantilla, no un código que pasa a chocar el compilador :)

Aquí es algo que puede funcionar para usted

#include <memory> 
#include <iostream> 

// uncomment this "catch all" function to make select(0) compile 
// int select(...){ return 0;} 
template<class T> int select(T*){ return 1;} 
template<class T> int select(std::auto_ptr<T>){ return 1;} 
// add boost::shared_ptr etc, as necessary 

int main() 
{ 
    std::cout << select(0) << std::endl; 
    std::cout << select(std::auto_ptr<int>()) << std::endl; 
    std::cout << select(&std::cout) << std::endl; 
    return 0; 
} 
Cuestiones relacionadas