C++ 右值参数是如何工作的?

C++ 右值参数是如何工作的?,c++,move,semantics,C++,Move,Semantics,所以我很惊讶地发现在这段代码中: void AddLayer( shared_Layer_ptr && pNewLayer_p ){ m_layers.push_back( pNewLayer_p ); // * } 被调用的push_-back是“¶m”,而不是“¶m”版本。m_layers是一个std::vector。 由于pNewLayer_p是一个“&&”,我认为它是一个该死的右值..我唯一能设法得到push_back(&&pa

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

void AddLayer( shared_Layer_ptr && pNewLayer_p ){

        m_layers.push_back( pNewLayer_p ); // *
    }
被调用的push_-back是“¶m”,而不是“¶m”版本。m_layers是一个std::vector。 由于pNewLayer_p是一个“&&”,我认为它是一个该死的右值..我唯一能设法得到push_back(&¶m)调用的方法是使用std::move:

m_layers.push_back( std::move(pNewLayer_p) );

对我来说似乎是多余的,因为pNewLayer_p已经是一个“&&”。。我肯定遗漏了一些东西,它是什么?

pNewLayer\u p是一个右值引用,但它本身不是右值-基本上是因为它有一个名称。R值在标准中定义如下:

(3.10/1)右值(历史上称为右值,因为右值可能出现在赋值表达式的右侧)是xvalue、临时对象(12.2)或其子对象,或与对象无关的值

换句话说,R值是文字、临时值和其他未命名的对象(例如xvalues,即刚刚由函数返回但尚未分配给任何对象的值)

代码中的右值引用
pNewLayer\p
是一个命名对象,因此它本身就是一个左值。将
std::move
应用于它(形式上是一个函数),将它(形式上)转换为从函数返回的内容,即xvalue,它是一个右值,可以传递给移动版本的
push_back
。这就是
std::move
存在的目的


(注意:以上假设
shared_Layer_ptr
是一种类型,而不是一个模板参数。如果它是一个模板参数,
shared_Layer_ptr&&
将是一个所谓的通用引用,即它可能是一个左值引用或右值引用,具体取决于模板的实例化方式。在这种情况下,
std::forward
w应该使用合适的函数来代替
std::move

想想如果它移动
pNewLayer
会发生什么

void AddLayer( shared_Layer_ptr && pNewLayer_p ){
    m_layers.push_back( pNewLayer_p );
    // what if pNewLayer_p is already moved
    another_m_layers.push_back( pNewLayer_p );
}
因此,必须明确使用
std::move

void AddLayer( shared_Layer_ptr && pNewLayer_p ){
    m_layers.push_back( pNewLayer_p );
    another_m_layers.push_back( std::move(pNewLayer_p) );
}

如果一个值引用只能在函数中出现一次,那么它肯定会从C++中移除一些能量。

是否值得使用STD::在这种情况下移动?它会避免推送后缀上的拷贝,还是完全取决于类型(在这种情况下是共享PTR)移动赋值过载?(我真的无法理解visual studio上混乱的实现)@如果使用
std::move
,它将调用
shared_Layer_ptr
的move构造函数将其放入向量中。如果不使用
std::move
,它将使用复制构造函数。如果
shared_Layer_ptr
的工作方式类似于
std::shared_ptr
,则move方法可以速度要快得多,因为不需要更新引用计数等。(注意,可能有第三种方法,使用
emplace\u back
而不是
push\u back
。只有在调用函数时新创建的对象是
pNewLayer\u p
时,才能使用此方法。@Iceone1000(…cont'd)
emplace\u back
获取新的
共享层\u ptr
的构造函数调用的参数,而不是构造的对象本身。然后它在向量内部构造它。这是最快的方法,但只适用于新创建的对象。如果对象是预先存在的,并且您想将它们移入,请使用
std::move
method.Thank老兄!shared_Layer_ptr真的是一个std::shared_ptr类型定义。我很想把std::move放在我的全身code@Icebone1000是的,在上述情况下,我认为这应该会有所帮助。如果你想真正确定,请确保测量时间。相关问题: