Ich habe folgendes Programm:C++ 11: Warum kann result_of Funktortyp als lvalue_reference akzeptieren, aber nicht als lvalue_reference?
#include<type_traits>
#include<iostream>
using namespace std;
template <class F, class R = typename result_of<F()>::type>
R call(F& f) { return f(); }
struct S {
double operator()(){return 0.0;}
};
int f(){return 1;}
int main()
{
S obj;
call(obj);//ok
call(f);//error!
return 0;
}
Es scheitert in der Zeile "call (f)" zu kompilieren. Es ist seltsam, dass "Anruf (Obj)" in Ordnung ist.
(1) Ich habe einen ähnlichen Beitrag in einem anderen Thread C++11 result_of deducing my function type failed. Aber es erklärt nicht, warum funktor Objekte in Ordnung sind, während Funktionen nicht sind.
(2) Ich bin mir nicht sicher, ob dies mit "R call (F & f)" zusammenhängt: ein Funktionstyp kann keinen L-Wert deklarieren?
(3) Solange ich weiß, sollte jedes Token mit einem Namen, wie Variable/Funktion, als ein l-Wert betrachtet werden. Und im Falle des Funktionsparameters sollte der Compiler meinen Funktionsnamen "f" zu einem Funktionszeiger "zerlegen", richtig?
(4) Dies ist wie ein Array verfallen und übergeben Sie es an eine Funktion ---- Und ein Funktionszeiger könnte ein l-Wert sein, was ist dann falsch mit "call (F & f)"?
Würdest du mir helfen, weitere Erklärungen zu geben, warum "ist" mein Fall, wo bin ich falsch gelaufen? Danke.
Vielleicht aus dem gleichen Grund, dass Sie nicht sagen können, Vorlage struct F {}; F {}; ' –