Ich habe den folgenden Code als ein Experiment bekam:C++ 11 wendet result_of auf Elementfunktion an, fehlgeschlagen, warum?
int f1() { return 0; }
struct Bar {
Bar() = delete;
int f() { return 0; }
int operator()() { return 1; }
};
int main()
{
decltype(f1()) x = 3;//f1() is expression
result_of<decltype(&f1)()>::type x1 = 3;//type+param
result_of<Bar()>::type x3 = 3;//type+param
decltype(declval<Bar>().f()) y = 4;//expression
decltype((((Bar*)nullptr)->*(&Bar::f))()) z = 5;//expression
result_of<decltype(std::mem_fn(&Bar::f))()>::type y2 = 3;//error!!!!!!
}
Alles ist in Ordnung mit Ausnahme der letzten result_of
: Ich habe versucht, den Rückgabetyp von Bar::f
zu bekommen, result_of
verwenden.
Warum es fehlgeschlagen ist, und wie man es korrigiert?
es ist eine Elementfunktion, erfordert es einen impliziten Objektparameter, dh 'result_of :: Typen y2' –
Danke, es funktioniert, aber scheint "result_of :: type y2 = 3;" kann auch Kompilation übergeben. Was ist richtig, warum BAR * kann noch zu diesem mem_fn gegeben werden? –
Es macht keinen Unterschied, ob Sie einen Zeiger oder einen Referenztyp verwenden. Hier kommt es auf die Wertkategorie und die KV-Qualifikation an –