Rumah >pembangunan bahagian belakang >C++ >Bolehkah Anda Mengambil Alamat Fungsi Perpustakaan Standard dalam C 20?
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"; }
Dalam ini kod, terdapat dua panggilan ke std::invoke. Baris #1 mengambil alamat std::boolalpha, manakala Baris #2 cuba melakukan perkara yang sama dengan std::tolower. Output yang dijangkakan ialah 'a'.
Timbul persoalan: adakah output yang dijangka dijamin dalam C 20? Untuk menjawabnya, kita mesti menyelidiki konsep fungsi boleh dialamatkan.
Menurut [namespace.std], melainkan ditetapkan secara eksplisit sebagai boleh dialamatkan, cuba mendapatkan penunjuk kepada fungsi perpustakaan standard atau rujukannya adalah tingkah laku yang tidak ditentukan (mungkin tidak berbentuk). Larangan ini meliputi pembentukan penunjuk kepada ahli untuk fungsi ahli bukan statik perpustakaan standard.
Baris #1:
std ::boolalpha ditetapkan sebagai fungsi boleh alamat oleh [fmtflags.manip]. Ini bermakna pengambilan alamatnya telah dibentuk dengan baik, bersamaan dengan std::cout.setf(std::ios_base::boolalpha).
Baris #2:
Malangnya, std::tolower tidak ditetapkan secara eksplisit sebagai boleh dialamatkan dalam [cctype.syn]. Oleh itu, percubaan Baris #2 untuk mengambil alamatnya mempunyai tingkah laku yang tidak ditentukan (mungkin tidak betul).
Keluaran yang dijangkakan tidak dijamin. Malah, kod tersebut tidak dijamin untuk disusun kerana tingkah laku yang tidak ditentukan dalam Baris #2.
Isu ini juga terpakai pada fungsi ahli. Seperti yang dinyatakan oleh [namespace.std], tingkah laku tidak ditentukan jika penunjuk dibawa ke fungsi ahli perpustakaan standard.
Atas ialah kandungan terperinci Bolehkah Anda Mengambil Alamat Fungsi Perpustakaan Standard dalam C 20?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!