正确:
template<typename T>
typename remove_reference<T>::type&& move(T&&d){
return static_cast<typename remove_reference<T>::type&&>(d);
}
错误:
template<typename T>
T&& move(T&&d){
return static_cast<typename remove_reference<T>::type&&>(d);
}
我不明白这些模板函数的实例化方式有何不同。这两个函数的返回类型有何不同?
最佳答案
这是 reference collapsing rules of C++11 的结果.
当你有类型 T &&
时:
- 如果
T
是U
那么你得到U &&
。 - 如果
T
是U &
那么你会得到U & &&
,它会折叠成U &
。 - 如果
T
是U &&
那么你会得到U && &&
,它会折叠成U &&
。
std::remove_reference
将从类型中“移除”左值引用或右值引用,导致 T &
和 T &&
变为T
。
所以,当 T
在你的情况下是 U &
那么返回类型是不同的:
- 您的第一个示例返回
U & &&
这实际上是U &
—— 根本不是我们想要的std::move()
返回! - 您的第二个示例返回
U &&
。
关于c++ - c++中模板的实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28086207/