C++ 模板别名的标识 让我们考虑一组模板别名: 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>; 使用foo=T*的模板; 使用bar=T*的模板; 使用buz=foo的模板; 模板结构id{}; 使用id_foo=id; 使用id_bar=id; 使用id_buz=id;
C++ 模板别名的标识 让我们考虑一组模板别名: 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>; 使用foo=T*的模板; 使用bar=T*的模板; 使用buz=foo的模板; 模板结构id{}; 使用id_foo=id; 使用id_bar=id; 使用id_buz=id;,c++,templates,c++11,standards,template-aliases,C++,Templates,C++11,Standards,Template Aliases,id\u foo、id\u bar、id\u buz类型相同还是不同?foo、bar、buz是相同还是不同的模板 不同的编者对此有不同的看法。 特别是, MSVC 2015和clang 3.5都是不同的 gcc 4.9对待buz与foo 第14.5.7章“别名模板”中的标准C++11不清楚。正如问题中所指出的,这是标准的一部分 14.5.7[临时别名]的当前措辞仅涉及别名模板的专门化与替换后的类型id的等效性。需要添加措辞,指定在什么情况下别名模板本身等同于类模板 也就是说:foo、bar和
id\u foo
、id\u bar
、id\u buz
类型相同还是不同?foo
、bar
、buz
是相同还是不同的模板
不同的编者对此有不同的看法。
特别是,
- MSVC 2015和clang 3.5都是不同的
- gcc 4.9对待
与buz
foo
也就是说:
foo
、bar
和buz
的任何专门化都将代表相同的类型。但不能保证,当用作模板参数时,foo
、bar
和buz
是可互换的。的解释似乎暗示是的,它们是相同的IMO。编辑:相关代码片段:别名模板是一个模板,当专门化时,相当于将别名模板的模板参数替换为类型id中的模板参数的结果。
以下问题的答案可能会有帮助:@T.C.除了它只是一个链接之外,这怎么不是答案P