Рассмотрим набор шаблонов псевдонимами:Идентичность шаблона псевдонимами
template<class T> using foo = T*;
template<class T> using bar = T*;
template<class T> using buz = foo<T>;
template< template<class>class TT > struct id {};
using id_foo = id<foo>;
using id_bar = id<bar>;
using id_buz = id<buz>;
ли id_foo
, id_bar
, id_buz
одинаковые или разные типы? Есть foo
, bar
, buz
такие же или разные шаблоны?
Различные составители имеют разные мнения по этому вопросу. В частности,
- MSVC 2015 и лязг 3,5 лечить все они разные
- GCC 4.9 лечит
buz
такое же, какfoo
Standard C++ 11 в «шаблонах Alias, глава 14.5.7 «неясно.
[cppreference] (http://en.cppreference.com/w/cpp/language/type_alias), похоже, подразумевает, что да, они являются тем же ИМО. Редактировать: соответствующий фрагмент: «Шаблон псевдонимов - это шаблон, который при специализированном эквиваленте является результатом замены аргументов шаблона шаблона псевдонимов для параметров шаблона в типе-id' – AndyG
http: //www.open- std.org/jtc1/sc22/wg21/docs/cwg_active.html#1286 –
Ответы на следующие вопросы могут быть полезны: [_Использование псевдонима шаблона вместо шаблона в шаблоне_] (http://stackoverflow.com/q/17392621/3043539) и [_Использовать поведение is_same_template в шаблонах aliases_] (http://stackoverflow.com/q/22892052/3043539). – Constructor