通常のキャストと参照へのキャストの違いを教えてください。

#include <iostream>

class Base {};
class Derived : public Base {};

int main()
{
Derived d;
Base& b1 = static_cast<Base&>(d); //@
Base& b2 = static_cast<Base>(d); //A
}

このようなとき、@だとコンパイルOK、Aだとコンパイルエラーになります。
どのような違いがあるのでしょうか?