Home > Backend Development > C++ > Can I Take the Address of a Standard Library Function Like `std::tolower`?

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

Patricia Arquette
Release: 2024-12-17 20:22:13
Original
491 people have browsed it

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

Can I Take the Address of a Function Defined in the Standard Library?

Standard C functions are powerful tools, but their interaction with syntax like std::invoke can sometimes reveal unexpected behavior. Consider the following code:

#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";
}
Copy after login

The first call to std::invoke with std::boolalpha works as expected, resulting in a call to std::cout.setf(std::ios_base::boolalpha) and setting the Boolean output format. However, the second call with std::tolower raises concerns.

Is the Expected Output Guaranteed?

Unfortunately, the expected output of this code is not guaranteed in C 20. According to [namespace.std](https://en.cppreference.com/w/cpp/header/namespace/std), taking the address of a standard library function (unless it's designated as addressable) is undefined behavior. The std::tolower function falls under this category.

Why is that?

The reason lies in the fact that the C standard library header is included verbatim in C . This means that the behavior of standard C functions like tolower must be consistent with the C standard, which specifically prohibits taking their addresses.

Conclusion

In conclusion, even though std::tolower behaves similarly to a standard library function with addressable properties in the C code snippet, its underlying implementation as a C function makes taking its address undefined behavior. This behavior is not specific to std::tolower but applies to any standard library function not explicitly designated as addressable.

The above is the detailed content of Can I Take the Address of a Standard Library Function Like `std::tolower`?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template