2017-11-10 9 views
1

私はdecltypeで遊んでいて、奇妙なことを発見しました。フリー関数を宣言型にしようとすると、なぜこのエラーが発生するのですか?それはlambdaとはうまく動作しますが、自由な機能ではうまく動作しません。私はここで何が間違っていますか?フリー関数のdecltypeエラー

#include <iostream> 
using namespace std; 

int fun() 
{ 
    cout << "inside fun" << endl; 
    return 1; 
} 

int main() 
{ 
    decltype(fun()) x = 2; 
    cout << x << endl; 

    auto lambda = []() -> int { cout << "inside lambda" << endl; return 3; }; 
    decltype(lambda) l = lambda; 
    l(); 

    decltype(fun) f = fun; // ERROR 
    f(); 
} 

エラーは次のとおりです。

prog.cc: In function 'int main()': 
prog.cc:19:19: warning: declaration of 'int f()' has 'extern' and is initialized 
    decltype(fun) f = fun; // ERROR 
       ^
prog.cc:19:23: error: function 'int f()' is initialized like a variable 
    decltype(fun) f = fun; // ERROR 
         ^~~ 

WandboxのURL:https://wandbox.org/permlink/E7BbGlyQD8FcHr5j

+1

コンパイルエラーについて質問している場合は、問題のエラーをコピーして質問に貼り付けてください。 –

+0

'decltype(&fun)f = &fun;' – Jarod42

答えて

2

は、本質的にdecltypeを使用せずに同じエラーです。

#include <iostream> 
using namespace std; 

int fun() 
{ 
    cout << "inside fun" << endl; 
    return 1; 
} 

int main() 
{ 
    // was: decltype(fun()) x = 2; 
    int x = 2; 
    cout << x << endl; 

    auto lambda = []() -> int { cout << "inside lambda" << endl; return 3; }; 
    decltype(lambda) l = lambda; 
    l(); 

    typedef int fn_type(); 
    fn_type* f = fun; // no problem 
    fn_type g = fun; // ERROR 
    f(); 
} 

fint()であると宣言しました。つまり、C++がサポートしていない新しい変数に関数をコピーしようとしているようです(関数はではなく、ファーストクラスのオブジェクトです)。おそらくあなたが望む機能ポインタを作成し、funから直接割り当てることができます。このポインタは、そのコンテキストで関数ポインタとして自動的に扱われます。

これは暗黙のうちに新しいクラス(普通の意味で普通のclass)を宣言しているので、lambdaではこれは起こりません。 のように動作します。これらはオーバーロードされたoperator()メソッドを持っていますが、実際は伝統的なC++の意味では機能しません。

2

decltype(楽しい)関数型ではなく、FNのPTRタイプを返します。関数を割り当てることはできず、関数ptrだけを割り当てることができます。あなたが自由に機能をラップしたい場合は、これらの選択肢があります。

  1. が関数PTR
  2. ラップラムダで楽しい()の呼び出しはstdで
  3. ラップの楽し::機能<>(注意してください:これはここでは仮想呼び出し)
関連する問題