2017-01-17 2 views
2

es so scheint, sollte legal sein:Warum kann ich decltype auf einem Extraction Operator

decltype(declval<istream>().operator>>(declval<istream>(), declval<int>())) test; 

Aber wenn ich versuche ich zu kompilieren erhalten:

Fehler C2661: std::basic_istream<char,std::char_traits<char>>::operator >>: nein Überladene Funktion benötigt 2 Argumente

Mache ich etwas falsch? Warum bewertet dies nicht zu einem istream?

EDIT:

Es has been pointed heraus, dass, weil istream& istream::operator>>(int&) Verfahren ist, wobei der erste Wert automatisch übergeben wird.

jedoch: decltype(declval<istream>().operator>>(declval<int>())) test; Fehler mit:

Fehler C2664: std::basic_istream<char,std::char_traits<char>> &std::basic_istream<char,std::char_traits<char>>::operator >>(std::basic_streambuf<char,std::char_traits<char>> *):

Fehler C2661: nicht Argument 1 von std::ios_base::iostate zu std::basic_istream<char,std::char_traits<char>> &(__cdecl *)(std::basic_istream<char,std::char_traits<char>> &)

Und decltype(istream::operator >> (declval<istream>(), declval<int>())) test; Fehler mit umwandeln kann std::basic_istream<char,std::char_traits<char>>::operator >> : keine überladene Funktion benötigt 2 Argumente

+0

Ein Mitglied 'oparator <<' von 'istream 'wird' istream 'nicht als erster Parameter nehmen. – StoryTeller

+0

@StoryTeller Sie sagen, dass implizit übergeben wird, oder? –

+0

@ JonathanMee - wie immer bei Elementfunktionen. – StoryTeller

Antwort

7

Die operator>>, die eine int nimmt, ist eine Elementfunktion (Sie zur Zeit die Syntax für beide Mitglied und nonmember Funktionen) und es nimmt ihr Argument durch Verweis (so, dass sie es füllen kann - declval<int>() gibt Sie ein int&&, Sie declval<int&>() benötigen eine int&) zu erhalten: direkt

using T = decltype(declval<istream>().operator>>(declval<int&>())); 

noch besser wäre es, nicht aufrufen, um den Betreiber, so dass Sie sich keine Sorgen darüber, welche operator<< Mitglied ist und was ist nicht:

using T = decltype(declval<istream&>() >> declval<int&>());