Концепты не работают

#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.
→ Ссылка