模板别名的标识

Nic*_*kin 10 c++ standards templates c++11 template-aliases

我们考虑一组模板别名:

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>;
Run Code Online (Sandbox Code Playgroud)

id_foo,id_bar,id_buz相同或不同类型的?是foo,bar,buz相同或不同的模板?

各种编译器对此有不同的看法.尤其,

  • MSVC 2015和clang 3.5对待它们都是不同的
  • gcc 4.9对待buz与...相同foo

第14.5.7章"别名模板"中的标准C++ 11目前还不清楚.

Pao*_*o M 1

正如TC在对该问题的评论中指出的那样,这是该标准的一个已知漏洞。

14.5.7 [temp.alias] 的当前措辞仅处理别名模板的特化与替换后的 type-id 的等价性。需要添加措辞来指定在什么情况下别名模板本身相当于类模板。

也就是说: 、和foo的任何特化都将表示相同的类型。但不能保证,当用作模板参数时,、和可以互换。barbuzfoobarbuz