【发布时间】:2013-01-25 23:09:13
【问题描述】:
假设我们有:
foo(A&& a);
如果你这样做了
A a;
foo(a);
它不会编译并且抱怨不能将左值绑定到 A&&。没关系。
但是,鉴于 std::move 的签名,
template<class T> typename remove_reference<T>::type&& std::move(T&& a);
看起来它需要一个右值引用,就像在 foo 中一样,为什么下面的代码符合?
A a;
std::move(a);
a 不是左值吗?
另外,据说编译会实例化:
typename remove_reference<A&>::type&& std::move(A& && a);
我不明白为什么不是:
typename remove_reference<A>::type&& std::move(A && a);
在我看来 a 的类型是 A,而不是 A&。
【问题讨论】: