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 和 clang 3.5 对待它们都是不同的
  • gcc 4.9 对待buzfoo

第 14.5.7 章“别名模板”中的标准 C++11 不清楚。

4

1 回答 1

1

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

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

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

于 2015-03-18T12:34:42.067 回答