g++ и clang++ разное поведение с шаблоном псевдонима

Пытаясь ответить на другой вопрос, я написал следующий код, который ведет себя по-разному в 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 специализации, то есть обрабатывает foo и alias как равные), а clang++ печатает 0 (то есть: активирует общую структуру bar, то есть обрабатывает foo и alias как разные).

Как обычно, вопрос: кто прав? г++ или клан++?


person max66    schedule 19.06.2017    source источник
comment
Похоже на ошибку компилятора в clang для меня   -  person Curious    schedule 19.06.2017
comment
clang 4.0.0 и gcc 7.1.1 по-прежнему дают одинаковые результаты   -  person Darklighter    schedule 19.06.2017
comment
@Darklighter, похоже, у меня не работает wandbox.org/permlink/NNpfctbYEU5l8SdM   -  person Curious    schedule 19.06.2017
comment
Если я правильно помню, формулировка в этом отношении изменилась, так что это может зависеть от интерпретации и/или стандарта. Для C++17 он должен быть идентичен вашему образцу.   -  person Jarod42    schedule 19.06.2017
comment
@Curious Извините, что я запутался, я просто хотел добавить, что поведение не меняется с текущими выпусками gcc и clang в отношении результатов, представленных в вопросе.   -  person Darklighter    schedule 19.06.2017
comment
CWG 1286   -  person cpplearner    schedule 19.06.2017