2010-03-17 9 views
7

, bu sabah beni uyandırdı. Bu aslında neden çalışıyor? Sürece fonksiyon test söz konusu olduğunda, bu işlev bir şey yapabilir nasıl hiçbir gövdeye sahiptir? Bunun neden ve nasıl çalıştığını bilmek istiyorum? Cevabını görmek gerçekten GERÇEKTİR.Neden bu çalışır (Templates, SFINAE). C++ dünkü yazıya atıfta

template<typename T> 
class IsClassT { 
    private: 
    typedef char One; 
    typedef struct { char a[2]; } Two; 
    template<typename C> static One test(int C::*); //NO BODY HERE 
    template<typename C> static Two test(…); //NOR HERE 
    public: 
    enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == sizeof(One) }; 
    enum { No = !Yes }; 
}; 

Bu çok ilginç bir fenomeni anlamak için şimdiden teşekkür ederiz.

+0

, '3.2/2'FC ve gör' 3.2/3 '(kullanarak" nin "kullanımı" tanımına ve sonuçları üzerinde hem "bir şey". Bunun için herhangi bir hatayı hiçbir vücut olsun testi olmasına rağmen neden –

cevap

6

Sana Evet enum atıfta olduğunu varsayıyorum? IsClassT<T>::test<T>(0)? sizeof aslında argümanlarını değerlendirmez. aşağıdaki gibi kod yasal olmasının nedeni budur bunu size kurtarmak için beklemek olsa bile, var: test taşımasının avantajlı beyan bulunduğundan

int* p = 0; 
int sizeof_int = sizeof(*p); //oops, p is 0 :(
+0

Ne gerçekten ilgileniyorum nedir? –

+7

Çünkü dönüş türü, gövde olmadan derleme zamanında bilinir. Bu sadece bir "char" veya "char [2]' dir. Bu tüm derleyici ihtiyaçları ve standart tarafından onaylanmış. açık olmak gerekirse, 'sizeof' fonksiyonu (örneğin, kod fonksiyonu boyutu değil), ve sadece tip bilmek gerekir hesaplamak için, bu tür bir gerçek nesne olmayan bir dönüş değeri için de geçerlidir. – Ari

8
  1. Sen derleyici hatası alınamıyor.

  2. Eğertest -Fonksiyon demiyorlar çünkü bağlayıcı hatası alınamıyor.

C++ Standart ISO/IEC 14.882: 2003 (E)

5.3.3 sizeOf sizeof operatörü işlenen cisim tasarımına bayt sayısını verir

. işlenen ya değerlendirilmez bir ekspresyon, veya parantez tip kimliği. sizeof İşletmeci, değil ...

... Standardese için