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
Libérer: 2024-12-17 20:22:13
original
491 Les gens l'ont consulté

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";
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal