Warum kann ich in Vorlagenargumenten keinen Zeiger auf Mitglieder heruntertragen?

Wenn ich einen Zeiger auf ein Basiselement erstelle, kann ich ihn normalerweise in einen Zeiger auf ein abgeleitetes Element konvertieren, jedoch nicht, wenn er in einer Vorlage wie der folgenden verwendet wird, in der das erste Vorlagenargument das zweite beeinflusst. Bekämpfe ich Compiler-Bugs oder sieht der Standard wirklich vor, dass dies nicht funktioniert?

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;
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage