Maison >développement back-end >C++ >Pouvez-vous prendre l'adresse des fonctions de bibliothèque standard dans C 20 ?
Considérez le code suivant :
#include <cctype> #include <functional> #include <iostream> int main() { std::invoke(std::boolalpha, std::cout); // #1 using ctype_func = int(*)(int); char c = std::invoke(static_cast<ctype_func>(std::tolower), 'A'); // #2 std::cout << c << "\n"; }
Dans ce code, il y a deux appels à std::invoke. La ligne n°1 prend l'adresse de std :: boolalpha, tandis que la ligne n° 2 tente de faire de même avec std :: tolower. Le résultat attendu est 'a'.
La question se pose : le résultat attendu est-il garanti en C 20 ? Pour répondre à cette question, nous devons approfondir le concept de fonctions adressables.
Selon [namespace.std], à moins d'être explicitement désigné comme adressable, tenter d'obtenir un pointeur vers une fonction de bibliothèque standard ou sa référence est un comportement indéfini (peut-être mal formé). Cette interdiction s'étend à la formation d'un pointeur vers un membre pour les fonctions membres non statiques de la bibliothèque standard.
Ligne n° 1 :
std ::boolalpha est désigné comme fonction adressable par [fmtflags.manip]. Cela signifie que prendre son adresse est bien formé, équivalent à std::cout.setf(std::ios_base::boolalpha).
Ligne n°2 :
Malheureusement, std::tolower n'est pas explicitement désigné comme adressable dans [cctype.syn]. Par conséquent, la tentative de la ligne n°2 de prendre son adresse a un comportement indéfini (peut-être mal formé).
Le résultat attendu n'est pas garanti. En fait, la compilation du code n'est même pas garantie en raison du comportement non défini de la ligne n°2.
Ce problème s'applique également aux fonctions membres. Comme l'indique [namespace.std], le comportement n'est pas défini si un pointeur est dirigé vers une fonction membre de la bibliothèque standard.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!