2012-05-22 21 views
11
struct X{}; 

template<class T> 
decltype(X() == int()) f(T const&){ return true; } 

int main(void) { 
    X x; 
    f(x); 
} 

¿Por qué, solo por qué? No hay operator== definido en ninguna parte!¿Por qué compila el siguiente código con MSVC++?

Realmente quiero entender lo que está sucediendo aquí, para proporcionar un informe detallado de errores en MS Connect. Mi viaje a la locura comenzó alrededor here en el Salón < C++> sala de chat ...

(Nota: Ni GCC ni Clang aceptar este código.)

Ah, y por cierto, la adición de una privada X(int) ctor hace que el compilación falle:

struct X{ 
    X(){} 
private: 
    X(int); 
}; 

template<class T> 
decltype(X() == int()) f(T const&){ return true; } 

int main(void) { 
    X x; 
    f(x); 
} 

salida:

1>src\main.cpp(12): error C2248: 'X::X' : cannot access private member declared in class 'X' 
1>   src\main.cpp(4) : see declaration of 'X::X' 
1>   src\main.cpp(1) : see declaration of 'X' 
+0

¿Lo aceptan otros compiladores? –

+0

@Billy: No, agregó esa información. Información general: casi me vuelvo loco por lo que MSVC hace aquí en la sala de chat de C++ y me rindo luego de un par de horas. – Xeo

+0

Agregó un poco de información de fondo. Además, ¿podría el infractor anónimo expresar el motivo del voto a la baja? – Xeo

Respuesta

7

¿Qué versión de MS VC++ una ¿Estás usando?

Por lo que puede valer la pena, VC++ 11 Beta rechaza el código con:

trash.cpp(8): error C2893: Failed to specialize function template ''unknown-type' f(const T &)' 
      With the following template arguments: 
      'X' 

No estoy seguro de que eso es lo que yo llamaría el mensaje de error más útil o informativo nunca, pero es rechazando el código.

En estas circunstancias, supongo que la presentación de un informe de error probablemente logre poco (si acaso). La respuesta que esperaría sería esencialmente: "Ya se corrigió en VC++ 11. Actualízate cuando puedas".

+0

Y aquí estaba pensando que en realidad estaba usando la beta VS11 ... ¿Qué versión exacta tienes? La mía es "Versión 11.0.40825.2 PREREL". – Xeo

+1

@Xeo: Versión 11.0.50214.1 BETAREL ". Si no me equivoco, tiene la Vista previa de tecnología en lugar de la versión beta. –

+0

Bueno, eso es todo. Voy a descargar la versión beta * real * y volver más tarde, gracias. – Xeo

Cuestiones relacionadas