Types de fonctions C ++

J'ai un problème de compréhension des types de fonction (ils apparaissent par exemple comme le Signature paramètre de modèle de std::function):

typedef int Signature(int); //the signature in question

typedef std::function<int(int)>  std_fun_1;
typedef std::function<Signature> std_fun_2;

static_assert(std::is_same<std_fun_1, std_fun_2>::value,
              "They are the same, cool.");

int square(int x) { return x*x; }

Signature* pf = square;   //pf is a function pointer, easy
Signature f;              //but what the hell is this?
f(42);                    //this compiles but doesn't link

La variable f ne peut pas être cédé, mais peut être appelé. Bizarre. Qu'est-ce bon pour, alors?

Maintenant, si je const-qualifier les typedef, je peux toujours l'utiliser pour construire d'autres types, mais, apparemment, rien d'autre:

typedef int ConstSig(int) const;

typedef std::function<int(int) const>  std_fun_3;
typedef std::function<ConstSig>        std_fun_4;

static_assert(std::is_same<std_fun_3, std_fun_4>::value,
              "Also the same, ok.");

ConstSig* pfc = square; //"Pointer to function type cannot have const qualifier"
ConstSig fc;            //"Non-member function cannot have const qualifier"

Ce coin reculé de la langue ont frappé, je ici? Comment est cet étrange type appelé et ce que je peux l'utiliser pour l'extérieur des paramètres de modèle?

source d'informationauteur marton78