Aşağıda söylediğim ( ESKİ POST altında ) bir dereceye kadar doğru olmalı, ancak bununla ilgili asıl sorun, SFINAE'nin yanlış kullanılmasıdır, bu yüzden artık bunun gcc'de bir hata olduğundan emin değilim.
Bir takma ad bildirimi her zaman başarılı olmalıdır, orada bir sınıf veya işlev bildirimi veya uzmanlık (takma adları uzmanlaştıramayacağınız için mantıklı değildir) olmadığı için orada SFINAE yapamazsınız. Takma ad bildirimi başarılı olmazsa, program yanlış biçimlendirilir. Bu nedenle derleyici, takma ad bildiriminin siz böyle bir şablonu somutlaştırmaya zorlayana kadar başarılı olamayacağını varsayabilir.
Bu nedenle, derleyicinin sfinae_v_t<T,...>
her zaman olduğunu düşünmesi mükemmel bir şekilde kabul edilebilir T
, çünkü bu program yanlış biçimlendirilmediğinde gerçekleşecektir. Bu nedenle, programın kötü biçimlendirilmediği tüm durumlarda, kısmi uzmanlaşmanın uzmanlaşmadığını ve bu nedenle bunun kötü biçimlendirildiğini size söyleyecektir. (Clang bunu yapar).
Derleyicinin bunu yapmaya zorlandığını sanmıyorum. Ve eğer öyle değilse ve sadece "Tamam, sfinae_v_t
bir çeşit, her neyse " diye düşünüyorsa , o zaman bu bir yeniden açıklama olduğu açık değildir. Bence bunlardan birini başlatana kadar hata atmamakta yanlış olan bir şey yok.
Ancak bunu başlattığımızda, ya bir yeniden açıklama yapmamız ya std::enable_if
da şablon argümanına bağlı olarak programın kötü biçimlendirilmiş olması sorunu olmalıdır . GCC bunlardan en az birini almalı ama hiçbirini almıyor.
Bu aynı zamanda daha kolay örnek için kesinlikle geçerli değildir std::enable_if
. Bu yüzden hala bunun GCC'de bir hata olduğunu düşünüyorum, ancak artık kesin olarak söyleyemediğim kadar aklımda kaldı. Sadece söyleyebilirim, birisi bunu bir hata olarak rapor etmeli ve gcc'den insanların bunu düşünmesine izin vermelidir.
ESKİ POST
Bu gcc'de bir hata. Standart bize işlev şablonlarında bir sınıf şablonunu dönüştürme kuralları verir . Bir sınıf şablonu, işlevi kısmi işlev şablonu sıralamasında diğerinin önüne gelirse diğerinden daha uzmanlaşmıştır.
Burada fonksiyonları oluşturdum ve şimdi gcc onları çağırmanın belirsiz olduğunu iddia ediyor, bu nedenle sınıf şablonlarının eşit olarak belirtildiğini de söylemek zorundayım.
Not: Standardı dikkatle okurken, kafamdaki derleyici clang ile aynı fikirde.