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
Vous devez vous connecter pour publier un commentaire.
Voici le paragraphe correspondant de la Norme. Il parle de lui-même.
Dans votre cas,
std_fun_1
etstd_fun_2
sont des objets identiques avec le même type de signatures. Ils sont à la foisstd::function<int(int)>
et peut à la fois tenir des pointeurs de fonction ou remboursables par anticipation des objets de typeint(int)
.pf
est un pointeur versint(int)
. C'est, il sert le même but questd::function
mais sans les machines de cette catégorie ou de soutien pour les instances de appelable objets.De même,
std_fun_3
etstd_fun_4
sont des objets identiques avec le même type de signature, et peut à la fois tenir des pointeurs de fonction ou remboursables par anticipation des objets de typeint(int) const
.De la même façon,
pfc
est un pointeur de fonction de typeint(int) const
et peut contenir des pointeurs vers des fonctions de ce type, mais pas les instances de appelable objets.Mais
f
etfc
sont les déclarations de fonction.La ligne:
Est identique équivalent à:
Qui est une déclaration d'une fonction nommée
fc
de typeint(int) const
.Il n'y a rien d'étrange ici. Vous avez tout simplement qui s'est passé lors de la syntaxe que vous avez probablement déjà à comprendre, à partir d'un point de vue, vous n'êtes pas habitués à.