私は、以下のプログラムを持っている:それは「コール(F)」の行でコンパイルに失敗しC++ 11:なぜresult_ofが関数型をlvalue_referenceとして受け入れることができますが、関数型は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;
}
。 "call(obj)"はOKです。
(1)別のスレッドで同様の投稿をしましたC++11 result_of deducing my function type failedしかし、ファンクションオブジェクトがなぜ機能していないのかは分かりません。
(2)これは "Rコール(F & f)"に関連するかどうかわかりません:関数型はl-値を宣言できませんか?
(3)私が知っている限り、変数/関数のような名前を持つトークンはl値と見なすべきです。そして、関数のパラメータの場合、コンパイラは関数名 "f"を関数ポインタに "崩壊"させるべきでしょうか?
(4)これは配列を崩壊して関数に渡すようなものです - 関数ポインタがl値の場合、 "call(F &f)"の何が間違っていますか?
「なぜ」が私の場合、さらに詳しい説明をするのに役立つでしょうか、どこが間違っていましたか?おかげさまで
おそらく、テンプレート struct F {};と言うことはできません。 F {}; ' –