Rumah >pembangunan bahagian belakang >C++ >Bolehkah Anda Mengambil Alamat Fungsi Perpustakaan Standard dalam C 20?

Bolehkah Anda Mengambil Alamat Fungsi Perpustakaan Standard dalam C 20?

Patricia Arquette
Patricia Arquetteasal
2024-12-27 02:54:18606semak imbas

Can You Take the Address of Standard Library Functions in C  20?

Bolehkah Alamat Fungsi Perpustakaan Standard Diambil?

Latar Belakang

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'.

Fungsi Boleh Diatasi

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.

Analisis

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).

Kesimpulan

Keluaran yang dijangkakan tidak dijamin. Malah, kod tersebut tidak dijamin untuk disusun kerana tingkah laku yang tidak ditentukan dalam Baris #2.

Fungsi Ahli Boleh Diatasi

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn