Czy jest to zgodne z prawem C ++, aby przekazać adres statycznej stałej int bez definicji do szablonu?

Mam problem z podjęciem decyzji, czy ten kod nie powinien się skompilować, czy tylko oba kompilatory, które próbowałem, mają błąd (GCC 4.2 i Sun Studio 12). Ogólnie, jeśli masz statycznego członka klasy, który deklarujesz w pliku nagłówkowym, musisz go zdefiniować w jakimś pliku źródłowym. Wyjątek stanowi jednak standard dla całek statycznych. Na przykład jest to dozwolone:

#include <iostream>

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

Bez potrzeby dodawania gdzieś definicji x poza ciałem klasy. Próbuję zrobić to samo, ale biorę także adres x i przekazuję go do szablonu. Powoduje to błąd linkera narzekający na brak definicji. Poniższy przykład nie łączy (brakuje definicji dla A :: x), nawet jeśli znajduje się w tym samym pliku źródłowym:

#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();
}

Co jest dziwne, ponieważ działa tak długo, jak długo nie przekazuję adresu do szablonu. Czy jest to błąd lub jakoś zgodny ze standardami technicznymi?

Edytuj: Powinienem zaznaczyć, że & A :: x jestnie wartość czasu wykonywania. Pamięć jest ustawiona na statycznie przydzielane zmienne w czasie kompilacji.

questionAnswers(4)

yourAnswerToTheQuestion