Std :: is_function nasıl uygulanır?


82

Aşağıdaki uygulama nasıl yapılır std::is_function?

template<class T>
struct is_function : std::integral_constant<
    bool,
    !std::is_const<const T>::value && !std::is_reference<T>::value
> {};

( CPP Referansından )

Bana öyle geliyor ki, intbu tanımın altında bir işlev olurdu. Neyi kaçırıyorum?


10
Parçayı düşünün !is_const.
aschepler

İşlev türleri neden sabit olamaz? Bu iğrenç tiplerle mi ilgili?
jtbandes

4
@jtbandes çünkü fonksiyonlar C ++ 'da nesne olmayan birkaç şeyden biridir.
Ayxan

1
Sanırım çünkü bir anlamda her zaman const
RiaD

Başlık yanıltıcı gibi hissediyorum. "Bu nasıl geçerli bir std :: is_function uygulamasıdır?" daha uygun görünüyor.
val diyor Reinstate Monica

Yanıtlar:


73

Göründükleri Let en koşullar üzerinden gitmek:
Eğer const Tconst (değil constfonksiyonlar nesneleri olmadığından gerçekten işlev türleri için geçerli değildir) ve Treferans (değil constaynı nedenle ya referanslar için geçerli değildir) , bir işlev türüdür. intçünkü uygun olmaz (veya başka bir işlev olmayan-olmayan referans türü) is_const<const int>::valueolup true.

Göre C ++ 17 Standart §11.3.5 fonksiyonları / Bölüm 7 : (vurgu madeni)

Bir cv-niteleyici-seq'in bir işlev bildirimindeki etkisi, işlev türünün üstüne cv-nitelendirmesi eklemekle aynı şey değildir. İkinci durumda, cv niteleyicileri yoksayılır. [Not: cv-niteleyici-seq değerine sahip bir işlev türü, cv uyumlu bir tür değildir; cv onaylı işlev türü yoktur. - son not] [...]


5
Ah .... Ben bunun is_const kısmı içinde "const" eksikti. Mantıklı.
Rian Quinn

54

Dilde türleri sadece iki kategoriye ayrılır olamaz referans türleri ve fonksiyon tiplerini: const-yeterliliğe sahip. Yani, const Tnitelikli bir tür olmazsa,T bir işlev türü veya bir başvuru türü . Referans türlerini hariç tutabiliyorsanız, yalnızca işlev türleriyle bırakılırsınız.

Gibi bir ev-eleme taşıyan bir fonksiyon tipi bu Not int(int) constolduğu değil const nitelikli türü. Tek gerçek kullanımı işaretçi-üye-işlev türlerini oluşturmak ya da ayrıştırmak olan "iğrenç bir işlev türü" örneğidir. Tür int(int) const, üst tarafa const-kalifikasyon eklenerek elde edilemezint(int) . Bunun yerine, constörtük nesne parametresine uygulanır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.