【发布时间】:2016-03-04 03:29:49
【问题描述】:
我注意到std::forward 在这种情况下毫无用处:
void consumeObject(std::unique_ptr<Object>&& robj) {
myvector.emplace_back(std::forward<std::unique_ptr<Object>>(robj));
}
这是为什么呢?我认为当右值引用绑定到函数参数(即我可以通过名称引用它)时,它会成为该范围内的左值,并且为了向前传递需要强制转换为右值引用(如完美转发)。
为什么它是错误的/无用的?
【问题讨论】:
-
“转换为右值引用”不是“完美转发”。它在移动。
-
另外:完美转发涉及到“万能引用”,你没有万能引用;你有一个右值参考。
std::move在这里就足够了。 -
@Dean 不,实现方式不同。
std::move旨在在没有明确指定的模板参数的情况下使用,如果你指定它会发生什么并不是很明显。std::forward是故意设计的,因此它需要一个显式的模板参数。 -
@Simple,它被称为forwarding reference,不是通用引用,请使用新的和批准的名称。
-
@Dean,
std::move总是转换为右值引用,但std::forward<T>有时转换为左值引用,有时转换为右值引用,具体取决于模板参数T。这个区别很重要!std::move的全部意义在于转换为右值。std::forward的重点是在绑定转发引用之前转换回对象的原始值类别。所以他们不会做同样的事情。
标签: c++