繁体   English   中英

绑定可修改的右值引用到可修改的左值

[英]Binding modifiable rvalue reference to modifiable lvalue

我有3个问题:

  1. 我可以将左值直接绑定到右值参考吗?

  2. 作为std::move()的对象会发生什么?

  3. std :: move和std::forward之间有什么区别?

struct myStr{
    int m_i;
};

void foo(myStr&& rs) { }

myStr rValueGene()
{
    return myStr();
}

int main() 
{
    myStr mS= {1};
    foo(rValueGene()); //ok passing in modifiable rvalue to rvalue reference

    // To Question 1:
    //below initilize rvalue reference with modifiable lvalue, should be ok
    //but VS2010 gives a compile error: error C2440: 'initializing' : cannot convert from    'myStr' to 'myStr &&' 
    //Is this correct ?
    myStr&& rvalueRef = mS;

    //by using std::move it seems ok, is this the standard way of doing this 
    //to pass a lvalue to rvalue reference
    //myStr&& rvalueRef = std::move(mS);

    // To Question 2:    
    //also what happens to mS object after std::move ?
    //destroyed , undefined ?
}

1>我可以将左值直接绑定到右值参考吗?

不是没有显式的强制转换(即: std::move )。

2> std :: move()对象会发生什么?

没有什么,直到它实际上被移动。 所有std::move都返回一个对你给它的r值引用。 实际移动发生在相关类型的移动构造函数/赋值中。

3> std :: move和std :: forward有什么区别?

std::move用于移动; std::forward用于转发。 这听起来很滑稽,但这就是主意。 如果您打算移动一个对象,那么您使用std::move 如果您打算转发对象,请使用std::forward

转发使用允许在引用类型之间进行转换的专用语义,以便在调用之间保留引用性质。 所有这些的具体细节都非常......技术性。

std::move 总是返回一个&&。 如果给它一个l值引用,它将返回一个r值引用。 如果为其指定值类型,则返回对该值的r值引用。 等等。

std::forward 并不总是返回一个&&。 从语法上讲, std::forward就是在做一个static_cast<T&&> 但是,由于围绕转换为&&类型的专门语法,此强制转换并不总是返回&&。 是的,这很奇怪,但它解决了转发问题,所以没人关心。 这就是为什么它包含在std::forward ,而不是自己明确地执行static_cast

问题1.是的,编译器是正确的。

问题2.没有任何反应。 std::move只是将事物转换为rvalues。

但是,如果您使用std::movemS (或myStr )传递给foo ,那么该函数可能会认为它可以“窃取”该对象,因此在函数调用之后mS可能最终处于未指定状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM