Looking at the signature of std::move():
template< class T >
typename std::remove_reference<T>::type&& move( T&& t ) noexcept;
it accepts an rvalue reference, but can be called with a non-reference value, e.g. std::string a = "a"; std::move(a). Why is this? What type will T have?