Законно ли в C ++ передавать адрес статического const int без определения в шаблон?

У меня возникают проблемы с решением, должен ли этот код компилироваться, или если только у обоих компиляторов, которые я пробовал, есть ошибка (GCC 4.2 и Sun Studio 12). В общем, если у вас есть статический член класса, который вы объявляете в заголовочном файле, вы должны определить его в некотором исходном файле. Однако в стандарте сделано исключение для статических константных интегралов. Например, это разрешено:

#include <iostream>

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

Без необходимости добавлять определение x вне тела класса. Я пытаюсь сделать то же самое, но я также беру адрес x и передаю его шаблону. Это приводит к ошибке компоновщика с жалобой на отсутствие определения. В приведенном ниже примере ссылка отсутствует (отсутствует определение для A :: x), даже если все это находится в одном и том же исходном файле:

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

Это странно, поскольку работает, пока я не передаю адрес в шаблон. Это ошибка или как-то технически соответствует стандартам?

Изменить: я должен указать, что & A :: X являетсяnot значение времени выполнения. Память выделяется для статически распределенных переменных во время компиляции.

Ответы на вопрос(4)

Ваш ответ на вопрос