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
Susan Sarandonasal
2024-11-12 07:58:011007semak imbas

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");
}

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"

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.

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");
}

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:
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