Концепты не работают
#include <concepts>
#include <type_traits>
template <std::signed_integral T>
std::make_unsigned_t<T> unsign(T x) {
return x;
}
int main() {
unsign(42);
unsign(42.);
}
Почему 2 вызов не компилируется из-за ошибки в std::make_unsigned_t<T>, а не из-за несоответствия типа концепту? Как исправить?
error: implicit instantiation of undefined template 'std::__make_unsigned_selector<double, false, false>' { typedef typename __make_unsigned_selector<_Tp>::__type type; };
Ответы (1 шт):
Автор решения: HolyBlackCat
→ Ссылка
Это минус концептов, наверное единственный по сравнению с обычным SFINAE.
Они (и концепты, и requires) проверяются поздно - уже после того, как шаблонный аргумент подставляется в возвращаемый тип и т. п.
Возможные решения:
- Завернуть
std::make_unsigned_tв свойusingс концептом на шаблонном параметре. - Использовать обычный SFINAE.