2015-05-12 21 views
6

następujący kod jest skompilowany z powodzeniem z brzękiem, ale nie gcc:gcc nie akceptuje Dodatek w domyślnym szablonie argumentu

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 = C++ 14 - pedantyczny) mówi:

clang 3.6.0 i 3.5.0 nie daje błędów.

Czy ja i clang naruszamy zasady C++ lub czy jest to błąd gcc?

Odpowiedz

4

Nie naruszyłeś żadnej zasady. Wydaje się to być problem z obsługą GCC dla zmiennych szablonów, nie tylko domyślne argumentów, ponieważ ta regulacja działa:

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

O ile mi wiadomo, to zmienna szablon jest równoznaczne z szablonu klasy zawijanie statycznego elementu, więc nie powinno to powodować żadnych problemów poza koniecznością napisania ::v.

Powiązane problemy