У меня есть класс B, производный от класса A. A объявляет статическое поле f, и B может объявлять подобное поле с тем же именем. Следующее не работает:
struct A { static int f; };
struct B : A { static int f; }; // A::f is different from B::f
struct C : A {}; // A::f is the same as C::f
BOOST_STATIC_ASSERT((&A::f != &B::f));
BOOST_STATIC_ASSERT((&A::f == &C::f));
Хотя теоретически эти утверждения могут быть проверены во время компиляции, они запрещены, поскольку константные выражения не могут принимать адреса.
Есть ли способ заставить этот вид проверки работать во время компиляции?
Попробуйте поместить определения статических переменных в область действия статических утверждений.
Это прекрасно работает с gcc 4.7.2:
struct A { static int f; };
struct B : A { static int f; };
struct C : A {};
int A::f;
int B::f;
static_assert(&A::f != &B::f, "B");
static_assert(&A::f == &C::f, "C");
int main()
{
}
Компилировать с:
$ g++ -std=gnu++11 test.cpp
$ ./a.out
Других решений пока нет …