Puis-je prendre l'adresse d'une fonction définie dans la bibliothèque standard ?
Les fonctions C standard sont des outils puissants, mais leur interaction avec la syntaxe comme std::invoke peut parfois révéler un comportement inattendu. 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"; }
Le premier appel à std::invoke avec std::boolalpha fonctionne comme prévu, ce qui entraîne un appel à std::cout.setf(std::ios_base::boolalpha ) et en définissant le format de sortie booléen. Cependant, le deuxième appel avec std::tolower soulève des inquiétudes.
La sortie attendue est-elle garantie ?
Malheureusement, la sortie attendue de ce code n'est pas garanti en C 20. Selon [namespace.std](https://en.cppreference.com/w/cpp/header/namespace/std), prendre l'adresse d'une fonction de bibliothèque standard (sauf si elle est désignée comme adressable) est un comportement indéfini. La fonction std::tolower entre dans cette catégorie.
Pourquoi est-ce ?
La raison réside dans le fait que l'en-tête de la bibliothèque standard C
Conclusion
En conclusion, même si std::tolower se comporte de la même manière qu'une fonction de bibliothèque standard avec des propriétés adressables dans l'extrait de code C, son implémentation sous-jacente en tant que fonction C rend la prise de son adresse indéfinie. Ce comportement n'est pas spécifique à std::tolower mais s'applique à toute fonction de bibliothèque standard non explicitement désignée comme adressable.
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!