Ich versuche, eine Typ-Traits-Klasse zu erstellen, um festzustellen, ob ein bestimmter Typ T
über den <<
-Operator von std::ostream
gestreamt werden kann. Ich verwende eine einfache SFINAE-Technik.Declval Ausdruck (für SFINAE) mit Std :: Ostream
Letztlich ist der Ausdruck I für die Substitution Versagen zu bewerten versuchen, ist:
decltype(std::declval<std::ostream>() << std::declval<T>()) ;
Meine Erwartung ist, dass eine Instanz t
vom Typ gegeben T
und eine std::ostream
Instanz os
, wenn der Ausdruck os << t
ist schlecht ausgebildet , sollte ein Substitutionsfehler auftreten.
Aber offensichtlich tritt Substitutionsfehler hier nie auf, unabhängig vom Typ T
. Und selbst wenn ich nur mit dem obigen Ausdruck decltype
außerhalb des Kontextes von SFINAE deklariere, kompiliert es glücklich, auch wenn T
nicht mit std::ostream
verwendet werden kann.
Zum Beispiel:
struct Foo { };
int main()
{
// This compiles fine using GCC 4.9.2
//
typedef decltype(
std::declval<std::ostream>() << std::declval<Foo>()
) foo_type;
}
Das oben kompilieren feine GCC 4.9.2 verwenden, das ist nicht das, was ich erwartet habe, da die <<
Betreiber nicht überlastet wird Foo
mit einer Art zu arbeiten. Und natürlich, wenn ich sage:
std::cout << Foo();
... Ich bekomme einen Compiler-Fehler. Warum also kompiliert der decltype
Ausdruck überhaupt überhaupt?
Es reagiert richtig mit 'std :: declval()'. Aber ich habe keine Ahnung warum. –
Quentin