Daw*_*dPi 0 c++ move c++11 c++14
根据http://en.cppreference.com/w/cpp/utility/move
std::move 声明如下:
template <typename T>
std::remove_reference<T>::type&& move(T&& t);
Run Code Online (Sandbox Code Playgroud)
至于我的理解去,当代码为模板,在扣除T中typename T失去约的参考信息,所以以下内容:
template <typename T>
void someFunction(T&& value);
Run Code Online (Sandbox Code Playgroud)
使用时如:
int five=5;
someFunction(five);
Run Code Online (Sandbox Code Playgroud)
然后
value 是类型的 int&T 是 int要么
const float value = 5.25;
someFunction(value);
Run Code Online (Sandbox Code Playgroud)
然后
value 是类型的 const float&T是const float.如果是这样,那么移动声明中没有必要将返回的类型声明为:
std::remove_reference<T>::type&&,因为T已经不是引用了.
此外,如果std::move采用作为参数的引用(实际上1-值参考),然后返回static_cast<T&&>(t)在std::move实际上由于参照塌缩将返回-1-参考值或R值的参考,所以它会表现得更像std::forward不移动.那么什么是诀窍,让它运作正常,我不明白?
您的示例不正确:
int five=5;
someFunction(five);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,T推断为int&,而不是int.第二个例子也是如此; T被推断为const int&.
因此,返回只是T&&意味着T&& &,这是T&由于参考折叠规则.
这就是为什么std::remove_reference需要,以确保没有类型的参考,以防止参考崩溃发生.