bwe*_*ber 53 c++ move forward c++11
我一直认为std::forward这只适用于模板参数.但是,我问自己为什么.请参阅以下示例:
void ImageView::setImage(const Image& image){
    _image = image;
}
void ImageView::setImage(Image&& image){
    _image = std::move(image);
}
这两个功能基本上是一样的; 一个采用l值参考,另一个采用r值参考.现在,我认为,std::forward如果参数是l值引用,则应返回l值引用,如果参数为1,则应返回r值引用,此代码可简化为如下所示:
void ImageView::setImage(Image&& image){
    _image = std::forward(image);
}
这类似于cplusplus.com提到的示例std::forward(只是没有任何模板参数).我想知道,如果这是正确与否,如果不是为什么.
我也问自己究竟会有什么区别
void ImageView::setImage(Image& image){
    _image = std::forward(image);
}
Rei*_*ica 74
如果没有明确指定其模板参数,则无法使用std::forward.它故意用于非推断的上下文中.
要理解这一点,你需要真正理解如何在内部转发引用(T&&对于推导的T)工作,而不是将它们视为"它的魔力".那么让我们来看看.
template <class T>
void foo(T &&t)
{
  bar(std::forward<T>(t));
}
假设我们这样称呼foo:
foo(42);
42是一个类型的右值int.T被推断为int.bar因此,调用int用作模板参数std::forward.返回类型std::forward<U>是U &&.在这种情况下,这是int &&,因此t作为右值转发.
现在,让我们这样打电话foo:
int i = 42;
foo(i);
i是一个左右的类型int.由于完美转发的特殊规则,当使用类型的左值V来推导T类型参数时T &&,V &用于推导.因此,在我们的例子中,T被推断为int &.
因此,我们指定int &为模板参数std::forward.因此它的返回类型将是" int & &&",它会崩溃int &.这是一个左值,因此i作为左值转发.
摘要
为什么这适用于模板,当你这样做时std::forward<T>,T有时是一个引用(当原始是左值时),有时不是(当原始是右值时).std::forward因此,将适当地转换为左值或右值参考.
您无法在非模板版本中精确地工作,因为您只有一种类型可用.更不用说setImage(Image&& image)不接受左值的事实- 左值不能绑定到右值引用.
Ron*_*ang 22
我推荐阅读"Effective Modern C++",其作者是Scott Meyers.
第23项:了解std :: move和std :: forward.
第24项:区分右值参考的通用引用.
从纯粹的技术角度来看,答案是肯定的:std :: forward可以做到这一切.std :: move不是必需的.当然,这两种功能都不是必需的,因为我们可以在任何地方写出演员,但我希望我们同意那将是,令人讨厌的.std :: move的吸引力很方便,错误的可能性降低,清晰度更高.
rvalue-reference:此函数接受rvalues不能接受左值.
void ImageView::setImage(Image&& image){
    _image = std::forward(image); //error 
    _image = std::move(image);//conventional
    _image = std::forward<Image>(image);//unconventional
}
首先请注意,std :: move只需要一个函数参数,而std :: forward需要一个函数参数和一个模板类型参数.
template <typename T> void ImageView::setImage(T&& image){
    _image = std::forward<T>(image);
}
通用引用(转发引用):此功能接受所有并完成转发.
您必须在中指定模板类型std::forward.
在这种情况下,Image&& image它总是一个r值引用,并且std::forward<Image>总是会移动,所以你也可以使用它std::move.
接受r值引用的函数不能接受l值,因此它不等于前两个函数.
| 归档时间: | 
 | 
| 查看次数: | 18388 次 | 
| 最近记录: |