СФИНА не работает с очень простым примером - PullRequest
0 голосов
/ 17 мая 2018
template<typename T, typename = std::enable_if_t<std::is_trivially_copyable<T>::value>>
inline
int test_sfinae(T tc) {
    return 1;
}

template<typename T, typename = std::enable_if_t<!std::is_trivially_copyable<T>::value>>
inline
int test_sfinae(T ntc) {
    return 2;
}

Может кто-нибудь объяснить мне, почему этот код не компилируется, и выдает следующее сообщение об ошибке:

C2995 'int test_sfinae (T)': шаблон функции уже определен

Я использую MVSC.

1 Ответ

0 голосов
/ 17 мая 2018

Аргументы шаблона по умолчанию не участвуют в разрешении перегрузки, поэтому ваши два объявления фактически идентичны.

Вы можете переписать объявление следующим образом:

template <typename T, 
          std::enable_if_t<std::is_trivially_copyable<T>::value, int> = 0>
inline int test_sfinae(T tc) {
    return 1;
}

template <typename T, 
          std::enable_if_t<!std::is_trivially_copyable<T>::value, int> = 0>
inline int test_sfinae(T ntc) {
    return 2;
}

Когда T тривиальноПри копировании, объявления будут выглядеть следующим образом:

template <typename T, int = 0>
inline int test_sfinae(T tc);

template <typename T, /* Something that does not compile... */ = 0>
inline int test_sfinae(T ntc);

Таким образом, будет выбрана первая перегрузка, и обратная, когда T не копируется тривиально.

...