Пожалуйста, рассмотрите следующую программу:
ФАЙЛ AH
template <typename T> struct C { static constexpr int x = 42; };
ФАЙЛ ЧД
#include "A.H"
template <> struct C<int> { static constexpr int x = 43; };
ФАЙЛ A. CC
#include "A.H"
void a() { std::cout << C<int>::x; }
ФАЙЛ B. CC
#include "B.H"
void b() { std::cout << C<int>::x; }
ГЛАВНАЯ ФАЙЛА. CC
void a(); void b();
int main() { a(); b(); }
Каков статус этой программы? Является ли он плохо сформированным, плохо сформированным без требуемой диагностики c, проявляет ли он неопределенное поведение, или ничего из вышеперечисленного (это нормально)?
Если ничего из вышеперечисленного, каков результат программа?
Если что-то из перечисленного выше нарушает, какое правило оно нарушает?
(Кроме того, будет ли ответ другим, если BH содержит частичную специализацию, а не явную специализацию?)