Maison >développement back-end >C++ >Puis-je prendre l'adresse d'une fonction de bibliothèque standard comme « std :: tolower » ?

Puis-je prendre l'adresse d'une fonction de bibliothèque standard comme « std :: tolower » ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-17 20:22:13493parcourir

Can I Take the Address of a Standard Library Function Like `std::tolower`?

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 est inclus textuellement dans C . Cela signifie que le comportement des fonctions C standards comme tolower doit être cohérent avec le standard C, qui interdit spécifiquement de prendre leurs adresses.

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!

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