Разница между `typename = enable_if_t <...>` и `enable_if_t <..., bool> = true` - PullRequest
0 голосов
/ 11 июля 2019

Есть ли разница между использованием typename = enable_if_t<...> и enable_if_t<...,bool> = true для SFINAE?Я спрашиваю конкретно, так как наткнулся на то, что похоже на ошибку: Ошибка компилятора с выражением сгиба в enable_if_t

Так что мне стало любопытно, есть ли какая-то фактическая разница между ними.

Ответы [ 2 ]

4 голосов
/ 11 июля 2019

Есть небольшие различия, но оба могут использоваться для SFINAE.

typename = enable_if_t<...> формы не допускают «простых» перегрузок:

template <typename T, typename = enable_if_t<cond<T>::value>>
void foo();

template <typename T, typename = enable_if_t<!cond<T>::value>>
void foo(); // Error: redeclaration of same function as default are not part of signature
            // Both are just template <typename, typename> void foo()

enable_if_t<cond, bool> = true не страдает от этого:

template <typename T, enable_if_t<cond<T>::value, bool> = true>
void foo();

template <typename T, enable_if_t<!cond<T>::value, bool> = true>
void foo();

Другая проблема с typename = enable_if_t<...> заключается в том, что использование может быть взломано:

template <typename T, typename = enable_if_t<cond<T>::value>>
void foo();

template <typename T, typename = enable_if_t<cond<T>::value>>
void bar(T);


foo<int>();   // Regular usage, SFINAE occurs
bar(42);      // Regular usage, SFINAE occurs
bar<int>(42); // Possible usage, SFINAE still occurs
// But
foo<int, void>();   // No substitution fails here, so no SFINAE
bar<int, void>(42); // No substitution fails here, so no SFINAE
1 голос
/ 11 июля 2019

Да, есть разница.Первый не работает, а второй работает.Причина этого в том, что параметры шаблона по умолчанию не являются частью сигнатуры функции.

Под «работой» я подразумеваю, что первая версия не удаляет функцию из набора перегрузок-кандидатов, что обычно является желаемой целью.когда используется enable_if.

Пример можно найти здесь (предоставлено @NathanOliver): http://coliru.stacked -crooked.com / a / a15a6f1d0eaff4ab

...