SFINAE зависит от типа удержания? - PullRequest
0 голосов
/ 04 октября 2018

Меня смущает следующая цитата в cppreference.com :

Это правило применяется при разрешении перегрузки шаблонов функций: при замене выведенного типа из-за сбоя параметра шаблона специализация отбрасывается из набора перегрузки, а не вызывает ошибку компиляции.

Означает ли это, что SFINAE не может работать без вывода типа?Например, рассмотрим следующий код:

template <typename T> std::true_type has_value_type_helper(typename T::value_type*);
template <typename> std::false_type has_value_type_helper(...);

template <typename T> inline constexpr bool has_value_type_v
   = decltype(has_value_type_helper<T>(nullptr))::value;

int main() {
   std::cout << has_value_type_v<int> << std::endl;
   std::cout << has_value_type_v<std::vector<int>> << std::endl;
}

Он работает, как и ожидалось, но, насколько я вижу, вычета типов нет.Аргумент шаблона указан явно в has_value_type_helper<T>(nullptr).Может ли даже SFINAE использоваться таким образом?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Может ли даже SFINAE использоваться таким образом?

Да.

Замена составляет часть процесса удержания.Явное предоставление аргументов шаблона не избавляет от необходимости подстановки ( [temp.deduct] / 2 ) - и ошибка замещения (S в SFINAE) не является ошибкой ( [temp.вычесть] / 8 ).

В этом случае, когда вы явно предоставляете T в has_value_type_helper, нам все равно нужно подставить T в аргумент T::value_type.Это происходит в непосредственном контексте подстановки, поэтому, если эта подстановка завершится неудачно - как это было бы для типов, подобных int, у которых нет псевдонима вложенного типа с именем value_type - это ... не ошибка, мы просто удаляемкандидат от рассмотрения.У нас есть еще один кандидат на резервное копирование, так что это прекрасно работает.

0 голосов
/ 04 октября 2018

Здесь нет «реального» вывода типа, потому что вы указали типы напрямую.Но sfinae все еще работает, так как компилятор определяет, что ему нужно использовать при создании экземпляров ваших шаблонов.

...