É legal C ++ para passar o endereço de uma constante estática int sem definição para um modelo?

Estou tendo problemas para decidir se este código não deve ser compilado ou se apenas os dois compiladores que eu tentei possuem um bug (GCC 4.2 e Sun Studio 12). Em geral, se você tiver um membro de classe estático declarado em um arquivo de cabeçalho, será necessário defini-lo em algum arquivo de origem. No entanto, uma exceção é feita no padrão para integrais constantes estáticas. Por exemplo, isso é permitido:

#include <iostream>

struct A {
    static const int x = 42;
};

Sem necessidade de adicionar uma definição de x fora do corpo da classe em algum lugar. Eu estou tentando fazer a mesma coisa, mas eu também peguei o endereço de xe passei para um template. Isso resulta em um erro de vinculador que reclama de falta de definição. O exemplo abaixo não liga (faltando uma definição para A :: x) mesmo quando está tudo no mesmo arquivo de origem:

#include <iostream>

template<const int* y>
struct B {
    static void foo() { std::cout << "y: " << y << std::endl; }
};

struct A {
    static const int x = 42;
    typedef B<&x> fooness;
};

int main()
{
    std::cout << A::x << std::endl;
    A::fooness::foo();
}

O que é bizarro, já que funciona desde que eu não passe o endereço para um modelo. Isso é um bug ou de alguma forma tecnicamente compatível com os padrões?

Edit: Devo salientar que & A :: x énão um valor de tempo de execução. A memória é reservada para as variáveis ​​alocadas estaticamente em tempo de compilação.

questionAnswers(4)

yourAnswerToTheQuestion