Czy błąd podstawienia jest błędem z zależnymi parametrami szablonu innego niż typ?
Powiedzmy, że mam te aliasy szablonów:
<code>enum class enabler {}; template <typename T> using EnableIf = typename std::enable_if<T::value, enabler>::type; template <typename T> using DisableIf = typename std::enable_if<!T::value, enabler>::type; </code>
Mogę wykonać następujące czynności w GCC:
<code>#include <iostream> template <typename T, EnableIf<std::is_polymorphic<T>> = {}> void f(T) { std::cout << "is polymorphic\n"; } template <typename T, DisableIf<std::is_polymorphic<T>> = {}> void f(T) { std::cout << "is not polymorphic\n"; } struct foo { virtual void g() {} }; int main() { f(foo {}); f(int {}); } </code>
Drukuje:
jest polimorficzny
nie jest polimorficzny
Które pasuje do moich oczekiwań.
Z brzękiem kod się nie kompiluje. Tworzy następujące komunikaty o błędach.
<code>test.cpp:11:58: error: expected expression template <typename T, EnableIf<std::is_polymorphic<T>> = {}> ^ test.cpp:14:59: error: expected expression template <typename T, DisableIf<std::is_polymorphic<T>> = {}> ^ test.cpp:20:3: error: no matching function for call to 'f' f(foo {}); ^ test.cpp:12:6: note: candidate template ignored: couldn't infer template argument '' void f(T) { std::cout << "is polymorphic\n"; } ^ test.cpp:15:6: note: candidate template ignored: couldn't infer template argument '' void f(T) { std::cout << "is not polymorphic\n"; } ^ test.cpp:21:3: error: no matching function for call to 'f' f(int {}); ^ test.cpp:12:6: note: candidate template ignored: couldn't infer template argument '' void f(T) { std::cout << "is polymorphic\n"; } ^ test.cpp:15:6: note: candidate template ignored: couldn't infer template argument '' void f(T) { std::cout << "is not polymorphic\n"; } ^ 4 errors generated. </code>
Czy powinien się skompilować? Który z dwóch kompilatorów jest uszkodzony?