неоднозначные частичные специализации со стандартным ::включить _если

У меня возникла проблема, описанная ниже:

#include <iostream>
#include <type_traits>

#define TRACE void operator()() const { std::cerr << "@" << __LINE__ << std::endl; }

template <class T>
struct check : std::true_type {};

template <class F, class T, class Check=void>
struct convert {
  TRACE;// first case
};

template <class F, class T>
struct convert<F*, T, typename std::enable_if<(check<F>::value && check<T>::value), void>::type> {
  TRACE; // second case
};

template <class T>
struct convert<int*, T, typename std::enable_if<(check<T>::value), void>::type> {
  TRACE; // third case
};

Затем

convert<int*, int> c;
c();

сообщит о неоднозначном создании экземпляра шаблона класса в g++ -4.5, g++ -4.6, g++ -4.7 и clang++ -3.1 (, все с параметром -std=c++0x)

Но если я заменю чек в третьем случае на

typename std::enable_if<(check<int>::value && check<T>::value), void>:type

Тогда clang++ -3.1 работает нормально.

Это ошибка компилятора или по стандарту?

6
задан TemplateRex 16 July 2012 в 12:03
поделиться