所以我真的很惊讶地发现在这段代码中:
void AddLayer( shared_Layer_ptr && pNewLayer_p ){
m_layers.push_back( pNewLayer_p ); // *
}
被调用的 push_back 是“& param”,而不是“&& param”版本。 m_layers 是一个 std::vector。 由于 pNewLayer_p 是一个“&&”,我虽然它是一个该死的右值..我设法获得 push_back(“&& param”) 调用的唯一方法是使用 std::move:
m_layers.push_back( std::move(pNewLayer_p) );
对我来说似乎是多余的,因为 pNewLayer_p 已经是一个“&&”。我肯定遗漏了什么,它是什么?
最佳答案
pNewLayer_p
是右值引用,但它本身不是右值——主要是因为它有一个名称。右值在标准中定义如下:
(3.10/1) An rvalue (so called, historically, because rvalues could appear on the right-hand side of an assignment expression) is an xvalue, a temporary object (12.2) or subobject thereof, or a value that is not associated with an object.
换句话说,右值是文字、临时对象和其他未命名的对象(例如 xvalues,即刚刚由函数返回但尚未分配给任何对象的值)。
代码中的右值引用 pNewLayer_p
是一个命名对象,因此它本身就是一个左值。将 std::move
应用到它,这是一个正式的函数,将它(正式地)变成从函数返回的东西,即一个 xvalue,它是一个可以传递给 move-version 的右值push_back
。这就是 std::move
存在的意义。
(注意:上面假设shared_Layer_ptr
是一个类型,而不是模板参数。如果是模板参数,shared_Layer_ptr &&
就是所谓的通用引用,即它可能是左值引用或右值引用,具体取决于模板的实例化方式。在这种情况下,std::forward
将是代替 std 的适当函数: : move
。)
关于c++ - 右值参数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16803701/