Rumah > pembangunan bahagian belakang > C++ > Bolehkah saya Mengambil Alamat Fungsi Perpustakaan Standard Seperti `std::tolower`?

Bolehkah saya Mengambil Alamat Fungsi Perpustakaan Standard Seperti `std::tolower`?

Patricia Arquette
Lepaskan: 2024-12-17 20:22:13
asal
499 orang telah melayarinya

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

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

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 disertakan verbatim dalam C . Ini bermakna bahawa kelakuan fungsi standard C seperti tolower mestilah konsisten dengan standard C, yang secara khusus melarang mengambil alamatnya.

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!

sumber:php.cn
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