g ++和clang ++与别名模板的不同行为

时间:2017-06-19 01:45:46

标签: c++ c++11 template-specialization type-alias

尝试回答另一个问题,我编写了以下代码,这些代码在g ++(6.3.0)和clang ++(3.8.1)中表现不同

#include <iostream>
#include <type_traits>

template <typename>
struct foo
 { };

template <typename T>
using alias = foo<T>;

template <template <typename...> class, template <typename...> class>
struct bar : public std::false_type
 { };

template <template <typename...> class C>
struct bar<C, C> : public std::true_type
 { };

int main()
 {
   // g++     print 1
   // clang++ print 0
   std::cout << bar<foo, alias>::value << std::endl;
 }

g ++打印1(即:激活专门化bar结构,即将fooalias视为等号)并且clang ++打印0(即:激活通用bar结构,即将fooalias视为不同的结果。)

像往常一样,问题是:谁是对的? g ++或clang ++?

0 个答案:

没有答案