2015-03-16 2 views
10

Рассмотрим набор шаблонов псевдонимами:Идентичность шаблона псевдонимами

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 «неясно.

+2

[cppreference] (http://en.cppreference.com/w/cpp/language/type_alias), похоже, подразумевает, что да, они являются тем же ИМО. Редактировать: соответствующий фрагмент: «Шаблон псевдонимов - это шаблон, который при специализированном эквиваленте является результатом замены аргументов шаблона шаблона псевдонимов для параметров шаблона в типе-id' – AndyG

+5

http: //www.open- std.org/jtc1/sc22/wg21/docs/cwg_active.html#1286 –

+0

Ответы на следующие вопросы могут быть полезны: [_Использование псевдонима шаблона вместо шаблона в шаблоне_] (http://stackoverflow.com/q/17392621/3043539) и [_Использовать поведение is_same_template в шаблонах aliases_] (http://stackoverflow.com/q/22892052/3043539). – Constructor

ответ

1

Как T.C. указал в his comment на вопрос, это known hole стандарта.

В текущей редакции 14.5.7 [temp.alias] применяется только эквивалентность специализации шаблона псевдонима с идентификатором типа после подстановки. Должна быть добавлена ​​формулировка, указывающая, при каких обстоятельствах сам шаблон псевдонимов эквивалентен шаблону класса.

То есть: любая специализация foo, bar и buz будет представлять собой один и тот же тип. Но нет гарантии, что при использовании в качестве параметра шаблона foo, bar и buz являются взаимозаменяемыми.