Bagaimana implementasi berikut ini std::is_function
?
template<class T>
struct is_function : std::integral_constant<
bool,
!std::is_const<const T>::value && !std::is_reference<T>::value
> {};
(dari Referensi CPP )
Menurut saya, sebuah int
akan menjadi fungsi di bawah definisi ini. Apa yang saya lewatkan?
!is_const
bagian itu.Jawaban:
Mari kita melihat kondisi yang muncul:
Jika
const T
tidak const (const
tidak benar-benar berlaku untuk jenis fungsi karena fungsi bukan objek), danT
bukan referensi (const
tidak berlaku untuk referensi baik karena alasan yang sama) , ini adalah tipe fungsi.int
(atau tipe non-fungsi-non-referensi lainnya) tidak akan cocok karenais_const<const int>::value
begitutrue
.Menurut C ++ 17 Standar §11.3.5 Fungsi / bagian 7 : (Penekanan tambang)
sumber
Hanya ada dua kategori tipe dalam bahasa yang tidak bisa memiliki kualifikasi-kualifikasi: tipe referensi, dan tipe fungsi. Jadi, jika
const T
gagal menjadi tipe const-kualifikasi, artinyaT
adalah tipe fungsi atau tipe referensi. Jika Anda dapat mengesampingkan tipe referensi, maka Anda hanya memiliki tipe fungsi.Perhatikan bahwa tipe fungsi yang membawa cv-kualifikasi, seperti
int(int) const
, bukan tipe const-kualifikasi. Ini adalah contoh dari "tipe fungsi menjijikkan", yang hanya menggunakan nyata untuk membuat atau mendekomposisi tipe fungsi pointer-ke-anggota. Jenisint(int) const
ini tidak dapat diperoleh dengan menambahkan const-kualifikasi di atasint(int)
. Sebaliknya,const
berlaku untuk parameter objek tersirat.sumber