Что означает typename = в параметрах шаблона?

Я видел это выражение на странице 189 книги "Effective Modern C++":

    template<typename T,
             typename = typename std::enable_if<condition>::type>
    explicit Person(T&& n);

Мне просто интересно, что означает часть "typename =". Это определенно выглядит как аргумент по умолчанию для параметра шаблона. Но разве вам не нужно что-то вроде «typename some_name = ...» в аргументе по умолчанию? У второго аргумента шаблона нет имени, и я не вижу, чтобы второй аргумент шаблона использовался в этом случае.

P.S. Когда я ищу ответ в Google (или любой другой поисковой системе), знак равенства всегда отбрасывается, и это просто делает поиск ответа практически невозможным...


person qft    schedule 19.03.2015    source источник


Ответы (1)


Это необязательный параметр шаблона без имени и со значением по умолчанию.
Он используется для применения условия enable_if; это создаст ошибку компилятора, если условие не будет выполнено.

Вы можете использовать точно такой же синтаксис для обычных аргументов метода.

person SLaks    schedule 19.03.2015
comment
Чтобы пояснить эту фразу: it will create a compiler error if the condition is not met: справедливо ли сказать, что это вызывает SFINAE (ошибка замены не является ошибкой), а конструктор не определен? (Я немного новичок в SFINAE.) - person kevinarpe; 03.10.2016