2016-02-08 78 views
0

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); 

至于我的理解去,当代码模板的Ttypename T扣除失去有关参考信息,所以以下内容:

template <typename T> 
void someFunction(T&& value); 

当使用像:

int five=5; 
someFunction(five); 

然后

  • value是类型的int&
  • Tint

const float value = 5.25; 
someFunction(value); 

然后

  • value的类型是const float&
  • Tconst float

如果是这样,那么在移动声明没有一点声明返回类型为: std::remove_reference<T>::type&&,因为T是已经不是一个引用。另外,如果std::move以参数(实践中的l值参考)为参数,则实际上由于参考折叠而返回static_cast<T&&>(t)将返回l值参考或r值参考,因此它将表现更多像std::forward不动。那么,什么是诀窍,它使它正常工作,我不明白?

+1

如果'value'为'int&','T'必须是'int'。引用崩溃。你不希望这种情况发生在返回类型上,你希望它始终是r值参考。 – LogicStuff

+0

我曾经犯过这个错误。多么尴尬! :-) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377。HTM#返回%20A && –

回答

7

你的例子是不正确的:

int five=5; 
someFunction(five); 

在这种情况下,T推导为int&,不int。第二个例子也是如此; T推导为const int&

因此,返回T&&将意味着T&& &,这是由于参考折叠规则造成的T&

这就是为什么std::remove_reference是必需的,以确保没有引用类型以防止引用崩溃发生。

+0

这将是T,然后,如果我下面有一个函数:?? 模板 void函数(T&A,T && b); – DawidPi

+0

@DawidPi并传递什么给它 – TartanLlama

+0

对,没错对不起,诠释A,B ,函数(a,std :: move(b)); – DawidPi

相关问题