为什么std::forward在这种情况下毫无用处
Why is std::forward useless in this context
我注意到std::forward
在这种情况下是无用的:
void consumeObject(std::unique_ptr<Object>&& robj) {
myvector.emplace_back(std::forward<std::unique_ptr<Object>>(robj));
}
为什么?我认为,当一个右值引用绑定到一个函数参数时(即,我可以按名称引用它),它就变成了该范围内的一个左值,并且为了向前传递,需要被强制转换到一个右价引用(如在完美转发中)。
为什么它错了/没用?
在这里使用std::forward
(本身)并不是错误的,但它是不合适的,因此具有误导性(从这个意义上讲,你可以说它实际上是错误的)。
拼写"将某物强制转换为对其类型的右值引用"的方式是std::move
。这是std::move
所做的唯一的事情——它是一个static_cast<T&&>
,在这里你不必拼写T
。
std::forward
是另一种野兽,用于完美转发完美转发只出现在模板中,其中转发引用是可能的。转发引用是指由于语言中的特殊规则,可以推断为左值引用或右值引用的引用。在那里,您需要std::forward<T>
来重新设置适当的值类别(左值或右值)。
玩具示例:
void print(int &)
{
std::cout << "Lvaluen";
}
void print(int &&)
{
std::cout << "Rvaluen";
}
template <class T>
void perfectForwarder(T &&v)
{
print(std::forward<T>(v));
}
int main()
{
int i;
perfectForwarder(i);
perfectForwarder(std::move(i));
perfectForwarder(42);
}
输出为:
Lvalue
R值
R值
[直播]
相关文章:
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 在这种情况下,java对象是否可以调用本机函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 在这种情况下,我真的复制了字节还是复制了字符?
- 为什么在这种情况下,bool 类型的输出等于 0?
- 在这种情况下,如何传递成员函数而不是函数?
- 为什么在这种情况下递增阵列名称有效?
- 在这种情况下我应该使用哪种设计模式
- 为什么在这种情况下我需要 .template
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- 我是否访问了已释放的内存,或者在这种情况下DrMemory报告不正确?
- 在这种情况下,"typename..."意味着什么?
- 为什么在这种情况下 x = 44?
- 在这种情况下是私有的吗?试图使操作员<<过载
- 在这种情况下,如何防止C++输出/控制台窗体关闭
- 为什么 lambda nullptr 取消引用在这种情况下有效?
- 为什么在这种情况下,前向声明不起作用?
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在这种情况下,为什么模板即时深度超过限制?
- 为什么std::forward在这种情况下毫无用处