Скажем, у меня есть эти шаблоны псевдонимы:Является ли сбой замещения ошибкой с зависимыми параметрами шаблона не-типа?
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;
я могу сделать следующее в НКУ:
#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 {});
}
Он печатает:
полиморфный
не полиморфный
Что соответствует моим ожиданиям.
С clang этот код не компилируется. Он выдает следующие сообщения об ошибках.
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.
Следует ли компилировать? Какой из двух компиляторов неисправен?
Ой, я чувствую себя глупо. У меня такое чувство, что это не имеет ничего общего с псевдонимами шаблонов, поэтому заголовок, возможно, вводит в заблуждение: • Извините за это, я немного раскрою и исправлю заголовок, если это получится. –
'DisableIf> = {}' - это инициализация списка инициализатора законного права? Могут ли структуры быть параметры шаблона? –
jpalecek
@jpalecek Нет, структуры не могут. Вот почему я использую enum :) –