Rumah > pembangunan bahagian belakang > C++ > Mengapa Penegasan Statik Gagal dalam Fungsi Templat Tidak Dipanggil?

Mengapa Penegasan Statik Gagal dalam Fungsi Templat Tidak Dipanggil?

Susan Sarandon
Lepaskan: 2024-11-12 07:58:01
asal
1049 orang telah melayarinya

Why Does a Static Assertion Fail in an Uncalled Template Function?

Static_Assert Failure Walaupun Fungsi Templat Tidak Dipanggil

Pertimbangkan fungsi templat berikut:

template <typename T>
inline T getValue(AnObject&) {
    static_assert(false, "this function has to be implemented for desired type");
}
Salin selepas log masuk

Apabila menyusun dengan g 4.6.3, walaupun tidak memanggil fungsi ini di mana-mana sahaja, kompilasi gagal dengan ralat:

static_assertion failed "this function has to be implemented for the desired type"
Salin selepas log masuk

Tingkah laku ini mungkin menimbulkan persoalan, kerana fungsi itu tidak digunakan dan tidak sepatutnya mencetuskan ralat kompilasi. Walau bagaimanapun, menurut piawaian C dalam [temp.res]/8:

If no valid specialization can be generated for a template definition, and that template is not instantiated, the template definition is ill-formed, no diagnostic required.
Salin selepas log masuk

Memandangkan tiada cara yang boleh dilaksanakan untuk membuat instantiate templat fungsi dengan pengkhususan yang sah yang akan disusun, definisi templat itu sendiri dianggap kurang bentuk badan. Ini membolehkan pengkompil menolaknya walaupun sebelum sebarang instantiasi berlaku.

Untuk menyelesaikan isu ini dan membenarkan pengesanan ralat tertunda, fungsi templat boleh diubah suai seperti berikut:

template <typename T>
struct foobar : std::false_type {
};

template <typename T>
inline T getValue(AnObject&) {
    static_assert(foobar<T>::value, "this function has to be implemented for desired type");
}
Salin selepas log masuk

Dengan menggunakan templat tambahan struct foobar sebagai bendera masa kompilasi, pengkompil tidak boleh segera menolak templat fungsi. Apabila disegerakan, pengkhususan yang berkaitan foobar akan menentukan sama ada penegasan statik harus gagal, seperti yang dimaksudkan.

Atas ialah kandungan terperinci Mengapa Penegasan Statik Gagal dalam Fungsi Templat Tidak Dipanggil?. 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