Подтвердить что ты не робот

В чем причина предоставления значения нуля по умолчанию для тестировщиков SFINAE?

Я заметил, что большая часть boost и libС++/libstdС++ явно предоставляет значение по умолчанию для SFINAE по умолчанию, например

// libc++ http://llvm.org/svn/llvm-project/libcxx/trunk/include/memory
namespace __has_pointer_type_imp
{
    template <class _Up> static __two __test(...);
    template <class _Up> static char __test(typename _Up::pointer* = 0);
}

template <class _Tp>
struct __has_pointer_type
    : public integral_constant<bool, sizeof(__has_pointer_type_imp::__test<_Tp>(0)) == 1>
{
};

Однако это смущает меня, почему это ожидалось, когда они явно делают вызов с 0. Я помню, как слышал, где-то это была оптимизация (ускорить компилятор при создании экземпляра шаблона), но я не совсем понимаю, как это сработает. Я посмотрел на стандарт и в нем есть раздел, в котором кратко описывается, что происходит с аргументами по умолчанию в отношении вывода аргумента шаблона.

14.8.2

В определенные моменты процесса вычитания аргумента шаблона необходимо взять тип функции, который использует параметры шаблона и заменяет эти параметры шаблона соответствующими аргументами шаблона. Это делается в начале вывода аргумента шаблона, когда любые явно заданные аргументы шаблона подставляются в тип функции, и снова в конце вывода аргумента шаблона, когда заменены любые аргументы шаблона, которые были выведены или получены из аргументов по умолчанию.

Последний бит там звучит относительно моего вопроса

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

Однако это звучит как противоположность оптимизации, если ему нужно больше работать. Есть ли у кого-нибудь аргументы, почему это 0 должно быть там, оно работает без него, но каждый пример SFINAE в libС++ по крайней мере, кажется, явно помещает 0 там, хотя они никогда не вызывают функцию без аргументов.

4b9b3361