据http://en.cppreference.com/w/cpp/utility/move为什么std :: move使用std :: remove_reference?
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)
将返回l值参考或r值参考,因此它将表现更多像std::forward
不动。那么,什么是诀窍,它使它正常工作,我不明白?
如果'value'为'int&','T'必须是'int'。引用崩溃。你不希望这种情况发生在返回类型上,你希望它始终是r值参考。 – LogicStuff
我曾经犯过这个错误。多么尴尬! :-) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377。HTM#返回%20A && –