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

Mengapa Penegasan Statik Gagal dalam Fungsi Templat Tidak Dipanggil dalam C 0x?

Mary-Kate Olsen
Lepaskan: 2024-11-06 16:42:03
asal
253 orang telah melayarinya

Why Does a Static Assert Fail in an Uncalled Template Function in C  0x?

Static_Assert Failure Walaupun Fungsi Templat Tidak Dipanggil

Dalam C 0x, templat dengan pengisytiharan static_assert yang tidak digunakan boleh mengakibatkan kegagalan kompilasi. Pertimbangkan kod berikut:

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

Anehnya, kod ini gagal dengan ralat:

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

Secara intuitif, seseorang akan menjangkakan pengkompil hanya membuat seketika fungsi templat jika ia dipanggil. Walau bagaimanapun, piawaian C menyatakan sebaliknya dalam [temp.res]/8:

Tiada diagnostik akan dikeluarkan untuk definisi templat yang mana pengkhususan yang sah boleh dijana. Jika tiada pengkhususan yang sah boleh dijana untuk definisi templat, dan templat itu tidak dibuat seketika, definisi templat adalah tidak betul, tiada diagnostik diperlukan.

Memandangkan tiada pengkhususan sah yang menyusun, pengkompil dibenarkan untuk menolak takrifan templat tanpa mengira sama ada ia dibuat seketika.

Untuk menyelesaikan isu ini, seseorang boleh mentakrifkan semula kod 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 the desired type");
}
Salin selepas log masuk

Pengubahsuaian ini menangguhkan diagnostik kepada instantiasi foobar pengkhususan, memastikan definisi templat dibentuk dengan baik sehingga itu.

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