Я пытаюсь использовать пару templatized функций для Substitution Fail Is Not An Error(SFINAE). И я могу сделать это вот так:Почему эти шаблонные функции не могут принимать аргументы?
template<typename R, typename S = decltype(declval<R>().test())> static true_type Test(R*);
template<typename R> static false_type Test(...);
Но я не понимаю, как аргумент заставляет этот SNFIAE работать. Похоже, что я просто должен быть в состоянии удалить аргументы и выбор шаблона будет работать точно так же:
template<typename R, typename S = decltype(declval<R>().test())> static true_type Test();
template<typename R> static false_type Test();
Но это не так, я получаю:
Зов перегружен «Test () 'является неоднозначным
Что это за аргументы, которые делают эту работу SFINAE?
Но помимо этого, есть что-то особенное об этих типах аргументов, что вызывает их оценивать в правильном порядке. Я не понимаю, почему компилятор предпочитает 'R *' '...'. Вы можете это объяснить? –
@JonathanMee, добавит к ответу. – SergeyA
@JonathanMee, чтобы выразить это просто, (...) является наименее предпочтительным совпадением с любым списком аргументов при выполнении разрешения перегрузки. Это по дизайну, и это предусмотрено стандартом. Кстати, это также наименее предпочтительный способ реализации функции с переменными аргументами :-) –