Это случилось:
Автор опубликовал рабочий код (<Policy>
присутствовал);
В комментариях было некоторое обсуждение, которое привело автора к редактированию кода, и он допустил ошибку (<Policy>
был удален);
Я исправил ошибку, вернув недостающий <Policy>
.
Может кто-нибудь объяснить, почему работает даже отредактированная версия?
Когда вы пытаетесь создать экземпляр Foo<T>
, объявление с параметрами шаблона по умолчанию учитывается компилятором. Параметр по умолчанию оценивается, и если std::is_base_of<BasePolicy, Policy>::value
равно false
, то enable_if
выдает ошибку, удобную для SFINAE.
Если std::is_base_of<BasePolicy, Policy>::value
равно true
, выбирается частичная специализация.
template <typename Policy>
struct Foo<Policy> {
Foo() { }
};
// is equivalent to
template <typename Policy>
struct Foo<Policy, void> {
Foo() { }
};
Вышеуказанные специализации эквивалентны, потому что typename std::enable_if<true>::type
по умолчанию void
.