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

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

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

Warum, nur warum? Es gibt keine operator== definierte überall!Warum kompiliert der folgende Code mit MSVC++?

Ich möchte wirklich verstehen, was hier vor sich geht, um einen detaillierten Fehlerbericht zu MS Connect zu liefern. Meine Reise in dem Wahnsinn begann um here in der Lounge < C++> Chat-Raum ...

(Anmerkung: Weder GCC noch Clang diesen Code akzeptieren.)

Oh, und btw, das Hinzufügen eines privater X(int) Ctor bewirkt, dass die Kompilation zum scheitern verurteilt:

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

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

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

Ausgang:

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

Haben andere Compiler es akzeptiert? –

+0

@Billy: Nein, diese Info hinzugefügt. Hintergrundinfo: Ich bin fast verrückt geworden, was MSVC hier im C++ Chatroom macht und gab nach ein paar Stunden auf. – Xeo

+0

Ein paar Hintergrundinformationen hinzugefügt. Könnte der anonyme Downvoter auch den Grund für den Downvote nennen? – Xeo

Antwort

7

Welche Version von MS VC++ ein verwendest du?

Denn was kann es sich lohnen, VC++ 11 Beta lehnt Ihren Code mit:

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

Ich bin mir nicht sicher, ob das, was ich immer am meisten nützlich oder informative Fehlermeldung nennen würde, aber es ist Ablehnung des Codes.

Unter den Umständen würde ich raten, einen Fehlerbericht zu archivieren wird wahrscheinlich wenig (wenn überhaupt) erreichen. Die Antwort, die ich erwarten würde, wäre im Wesentlichen: "Bereits in VC++ 11 behoben. Upgrade, wenn Sie können."

+0

Und hier dachte ich, dass ich tatsächlich die VS11 Beta verwendete ... Welche genaue Version hast du? Meine "Version 11.0.40825.2 PREREL". – Xeo

+1

@Xeo: Version 11.0.50214.1 BETAREL ". Wenn ich mich nicht irre, haben Sie die Technologievorschau und nicht die Beta. –

+0

Nun, so viel dazu. Ich werde die * echte * Beta herunterladen und später zurückkommen, danke. – Xeo