以下のコード

#include <iostream>
class foo
{

};

void f(foo&& r)
{
    std::cout << "rvalue ref" << std::endl;
}
void f(foo& r)
{
    std::cout << "lvalue ref" << std::endl;
}

int main()
{
    foo&& r = foo();

    std::cout << "foo() is ";
    f(foo());
    std::cout << "r is ";
    f(r);

    return 0;
}

において出力結果は

foo() is rvalue ref
r is lvalue ref

となりました。

foo() is rvalue ref

は理解できますが

r is lvalue ref

となるのは驚きでした。
r は foo&& すなわちfooへのrvalue referenceのはずですから
f(r)はf(foo&& r)にオーバーロード解決されるであろうと予測していたからです。

しかし、f(foo& r)にオーバーロード解決されているということは
r は lvalue referenceということでしょうか?