Maison >développement back-end >C++ >Pouvez-vous prendre l'adresse des fonctions de bibliothèque standard dans C 20 ?

Pouvez-vous prendre l'adresse des fonctions de bibliothèque standard dans C 20 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-27 02:54:18538parcourir

Can You Take the Address of Standard Library Functions in C  20?

Les adresses des fonctions de bibliothèque standard peuvent-elles être prises ?

Contexte

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'.

Fonctions adressables

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.

Analyse

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é).

Conclusion

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.

Fonctions membres adressables

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn