c++ - 右值参数如何工作?

标签 c++ move semantics

所以我真的很惊讶地发现在这段代码中:

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/

相关文章:

c++ - char a[] 的语义

c - Ruby 的最大函数顺序如何重复?

c++ - 如何使用 boost 程序选项获取默认参数值?

c++ - 如何存储对象供以后使用并使它们可搜索

svn - 是否有可能将 subversion 中错误完成的 move 转换为真正的 svn mv?

java - 如何 move 棋盘?

php - 检查空数组 : count vs empty

c++ - 是否允许在 decltyped 的变量的初始化程序中使用 decltype?

c++ - 将 Unicode 转换为 ASCII 的代码

C++11 最佳实践 : When to accept by value vs const&?