gcc

2015-05-12 23 views
6

takiben kodu başarıyla clang derlenmektedir varsayılan şablon argüman paket genişleme kabul etmez, ancak gcc başarısız:gcc

struct fn 
{ 
    template <typename ... Args> 
     static constexpr bool call (Args ...) { return true; } 
}; 

template <typename ... T> 
    static constexpr bool f = false; 

template <typename ... Ts, bool F = fn::call(f<Ts> ...)> 
    void hoge() {} 

int main() {} 

gcc 5.1.0 (-Wall -Wextra -std = ++ 14 c - pedantic), hata veren 3.6.0 ve 3.5.0 hatalarını bildirir.

C++ kurallarını ihlal ettiğimi ve clang olduğumu mu yoksa bu bir gcc hatası mı?

cevap

4

Hiçbir kuralı ihlal etmediniz. Bu ayarlama işleri, çünkü değişken şablonları, sadece varsayılan bağımsız değişkenler için GCC desteği ile ilgili bir sorun olarak görünmektedir:

template <typename ... T> 
struct f { 
    static constexpr bool v = false; 
}; 

template <typename ... Ts, bool F = fn::call(f<Ts>::v ...)> 
    void hoge() {} 

http://coliru.stacked-crooked.com/a/ff81b6ab052a748b

olarak bildiğim kadarıyla, bir değişken şablon sınıf şablonuna eşdeğerdir

Statik bir üyeyi sarmak, bu yüzden ::v'u yazmanın yanı sıra herhangi bir soruna neden olmamalıdır.