identity
может использоваться для принудительного указания аргумента шаблона в явном виде. Это эффективно предотвращает участие этого параметра функции в выводе аргумента шаблона.
Квалифицированное имя типа является одним из не выведенных контекстов; то есть identity<E>::type
не будет использоваться для вывода параметра шаблона для E
.
Например, если у вас есть:
template<class E>
void f(typename boost::mpl::identity<E>::type e) { }
f(42); // won't work
f<int>(42); // works