Почему я не могу уменьшить указатель на элементы в аргументах шаблона?

Если я создаю указатель на базовый член, я обычно могу преобразовать его в указатель на производный член, но не при использовании в шаблоне, таком как Buzz ниже, где первый аргумент шаблона влияет на второй. Я борюсь с ошибками компилятора или стандарт действительно требует, чтобы это не работало?

struct Foo
{
    int x;
};

struct Bar : public Foo
{
};

template<class T, int T::* z>
struct Buzz
{
};

static int Bar::* const workaround = &Foo::x;

int main()
{
    // This works. Downcasting of pointer to members in general is fine.
    int Bar::* y = &Foo::x;

    // But this doesn't, at least in G++ 4.2 or Sun C++ 5.9. Why not?
    // Error: could not convert template argument '&Foo::x' to 'int Bar::*'
    Buzz<Bar, &Foo::x> test;

    // Sun C++ 5.9 accepts this but G++ doesn't because '&' can't appear in
    // a constant expression
    Buzz<Bar, static_cast<int Bar::*>(&Foo::x)> test;

    // Sun C++ 5.9 accepts this as well, but G++ complains "workaround cannot
    // appear in a constant expression"
    Buzz<Bar, workaround> test;

    return 0;
}

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

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