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
Lepaskan: 2024-12-27 02:54:18
asal
614 orang telah melayarinya

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";
}
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan