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