Wenn ich den folgenden Code mit MSVC++ kompilieren, bekomme ich eine Fehlermeldung:Template Funktionstyp Abzug und Operator << C++
struct A
{
template<typename T>
void operator<<(T&& x)
{
}
};
void f()
{
}
int main()
{
A().operator<<(f); // ok
A() << f; // error
return 0;
}
g ++ und Klirren sowohl diesen Code in Ordnung kompilieren. AFAIK 'ok' und 'Fehler' Linien tun genau das Gleiche, und geben T zu Lücke geschlossen wird (&)(). Oder ist es void() und Rvalue Verweise auf die Funktion sind erlaubt? Wenn ja, welche Bedeutung haben sie? Ist es in Ordnung, Funktionen als Referenz zu übergeben? Ist es MSVC++ Fehler, der es kompiliert 'Fehler' Zeile? BTW, die Fehlerausgabe:
no operator found which takes a right-hand operand of type 'overloaded-function' (or there is no acceptable conversion)
could be 'void A::operator <<<void(void)>(T (__cdecl &&))'
with[ T=void (void) ]
können Sie die Version Ihres c liefern ++ Compiler? – xis
MSVC++ 2012 mit NOV CTP Update, gcc 4.5.3 und 4.7.2 getestet, clang 3.0 und 3.1 getestet. – dsi
Ich habe kein VC11, daher ist es schwer für mich zu untersuchen, aber es riecht wie ein Bug mit URef kollabiert. Der Compiler interpretiert es fälschlicherweise als RRef, um zu funktionieren, und akzeptiert keinen lvalue in der Eingabe. Es wäre interessant zu überprüfen, ob 'typedef void (* test)(); Test g() {return f; } ... A() << g(); 'würde funktionieren –