Ist es in C ++ zulässig, die Adresse einer statischen const int ohne Definition an eine Vorlage zu übergeben?

Ich habe Probleme bei der Entscheidung, ob dieser Code nicht kompiliert werden soll oder ob nur beide Compiler, die ich ausprobiert habe, einen Fehler aufweisen (GCC 4.2 und Sun Studio 12). Im Allgemeinen müssen Sie ein statisches Klassenmitglied, das Sie in einer Header-Datei deklarieren, in einer Quelldatei definieren. Im Standard wird jedoch eine Ausnahme für statische konstante Integrale gemacht. Zum Beispiel ist dies erlaubt:

#include <iostream>

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

Ohne dass irgendwo außerhalb des Klassenkörpers eine Definition von x hinzugefügt werden muss. Ich versuche dasselbe zu tun, aber ich nehme auch die Adresse von x und übergebe sie an eine Vorlage. Dies führt zu einem Linker-Fehler, der sich über eine fehlende Definition beschwert. Das folgende Beispiel verknüpft nicht (es fehlt eine Definition für A :: x), auch wenn sich alles in derselben Quelldatei befindet:

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

Das ist bizarr, da es funktioniert, solange ich die Adresse nicht an eine Vorlage weitergebe. Ist das ein Bug oder irgendwie normkonform?

Edit: Ich sollte darauf hinweisen, dass & A :: x istnicht ein Laufzeitwert. Während der Kompilierung wird Speicher für statisch zugewiesene Variablen reserviert.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage