Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
Mary-Kate Olsenasal
2024-11-06 16:42:03148semak imbas

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

Anehnya, kod ini gagal dengan ralat:

static_assertion failed "this function has to be implemented for the desired type"

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

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!

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