2017-12-18 132 views
9

Geçenlerde böyle koduyla sorun vardı:Derleyici eklemeden önce derleyici otomatik şablon parametresini neden alamıyor?

constexpr auto lambda = []{}; 

template<auto& l> 
struct Lambda {}; 

template<auto& l> 
void test(Lambda<l>) {} 

int main() { 
    test(Lambda<lambda>{}); 
} 

clang Hem ve l anlamak olamaz GCC söyler. Orada const eklerseniz

Ancak:

// ----v 
template<const auto& l> 
void test(Lambda<l>) {} 

Sonra her şey clang ile çalışır. GCC hala başarısız. Burada neler oluyor? const'un kendiliğinden çıkarılamaz mı? Her iki durumda da l sonucunu çıkarmamak için bir GCC hatası mı?

cevap

8

Bu, her iki durumda da sonuç çıkarmamak için bir GCC hatası mı?

Bu bir hatadır ve Clang için de. Yer tutucu tipi olmayan tip argüman için [temp.arg.nontype]/1 diyor ki: Bir şablon parametresinin türü bir yer tutucu türü içeriyor

ise sonucuna parametre tipi yer tutucu ile şablon argüman türü belirlenir tür kaybı. Şablon parametresi beyanı ([temp.param]) için çıkarılan bir parametre türüne izin verilmezse, program kötü biçimlendirilir.

bu l sabit başvuru olan

int main() { 
    auto& l = lambda; 
} 

burada anlamak hangi ile aynı proses.