Bolehkah saya Mengambil Alamat Fungsi yang Ditakrifkan dalam Perpustakaan Standard?
Fungsi Standard C ialah alat yang berkuasa, tetapi interaksinya dengan sintaks seperti std::invoke kadangkala boleh mendedahkan tingkah laku yang tidak dijangka. Pertimbangkan kod berikut:
#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"; }
Panggilan pertama ke std::invoke dengan std::boolalpha berfungsi seperti yang diharapkan, menghasilkan panggilan ke std::cout.setf(std::ios_base::boolalpha ) dan menetapkan format output Boolean. Walau bagaimanapun, panggilan kedua dengan std::tolower menimbulkan kebimbangan.
Adakah Output yang Dijangka Dijamin?
Malangnya, output yang dijangkakan bagi kod ini ialah bukan dijamin dalam C 20. Menurut [namespace.std](https://en.cppreference.com/w/cpp/header/namespace/std), mengambil alamat fungsi perpustakaan standard (melainkan ia ditetapkan sebagai boleh dialamatkan) adalah tingkah laku yang tidak ditentukan. Fungsi std::tolower berada di bawah kategori ini.
Mengapa begitu?
Alasannya terletak pada fakta bahawa pengepala perpustakaan standard C
Kesimpulan
Kesimpulannya, walaupun std::tolower berkelakuan serupa dengan fungsi perpustakaan standard dengan sifat boleh dialamatkan dalam coretan kod C, pelaksanaan asasnya sebagai fungsi C membuat pengambilan alamatnya tingkah laku yang tidak ditentukan. Tingkah laku ini tidak khusus untuk std::tolower tetapi terpakai pada mana-mana fungsi perpustakaan standard yang tidak ditetapkan secara eksplisit sebagai boleh dialamatkan.
Atas ialah kandungan terperinci Bolehkah saya Mengambil Alamat Fungsi Perpustakaan Standard Seperti `std::tolower`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!