Да, кажется, что это всегда было разрешено. Объединение - это класс, а шаблон - это либо функция, либо шаблон класса.
Соответствующие части стандартов:
[Темп]
Объявление в декларации шаблона должно
- объявить или определить функцию или класс, [...]
[класс]
Объединение - это класс, определенный с помощью ключа класса union
(Таким образом, можно утверждать, что новый признак типа std::is_class является небольшим неправильным обозначением, поэтому предполагается, что свойства разделяют пространство типов, и поэтому is_union является отдельным, взаимоисключающим признаком.)
Ответ 2
Да, я использовал такие конструкции раньше:
template <typename T>
union test
{
unsigned char ch[sizeof(T)];
T variable;
};