根据http://en.cppreference.com/w/cpp/utility/move
std::move
声明如下:
template <typename T>
std::remove_reference<T>::type&& move(T&& t);
就我的理解而言,当代码被模板化时,T
中typename T
的推断会丢失有关引用的信息,因此遵循:
template <typename T>
void someFunction(T&& value);
使用时如:
int five=5;
someFunction(five);
然后
value
的类型为int&
T
是int
或
const float value = 5.25;
someFunction(value);
然后
value
的类型为const float&
T
是const float
。如果是这样,那么移动声明中没有必要将返回的类型声明为:
std::remove_reference<T>::type&&
,因为T已经不是参考。
此外,如果std::move
将参数作为参数(在实践中为l值引用),则实际上由于引用折叠而在static_cast<T&&>(t)
中返回std::move
将返回l值引用或r值引用,因此它的行为更像std::forward
而不移动。那么什么是诀窍,让它运作正常,我不明白?
答案 0 :(得分:7)
您的示例不正确:
int five=5;
someFunction(five);
在这种情况下,T
推断为int&
,而不是int
。第二个例子也是如此; T
被推断为const int&
。
因此,仅返回T&&
意味着T&& &
,由于参考折叠规则而导致T&
。
这就是为什么std::remove_reference
是必需的,以确保没有类型的引用来防止引用崩溃。