Первое, что стоит отметить, VS2010 устарел и был сломан в день выпуска.Ключевое слово decltype было особенно проблематичным и работает только для самых основных целей.На самом деле многие базовые вещи совершенно неверны.
Далее код ...
template<class IntT, IntT low = IntT(), IntT high = IntT()>
struct X
{
static_assert(std::is_same<decltype(low),decltype(high)>::value,"Different types not allowed");//this should give error if types are different
Но они никогда не будут.
decltype(low) a;
decltype(high) b;
Вам не нужен decltype здесь.Тип IntT.
X():a(decltype(a)()),b(decltype(b)())//WHY THIS DOES NOT COMPILE?
Поскольку VS2010 не работает и, как правило, не позволяет использовать выражение decltype, как если бы оно было типом.Определение типа перед рукой может быть лучше.
К счастью, вам это не нужно, поскольку вы можете просто использовать конструктор по умолчанию, а не копию.
int _tmain(int argc, _TCHAR* argv[])
{
X<char,1,'a'> x;//this according to static_assert shouldn't compile but it does
Нет.Static_assert проверяет, совпадают ли типы.Они оба char
с значениями 1 и 'a'.
return 0;
}
Похоже, вы пытаетесь создать шаблон так, чтобы тип второго и третьего параметровоснованы на любом разрешенном типе значения, которое вы передаете в него.Это не может быть сделано.