1

我有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 ?
}
4

2 回答 2

3

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

并非没有明确的演员表(即:)std::move

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

在它真正被移动之前什么都没有。所做的只是返回一个对你std::move给它的 r 值引用。实际移动发生在相关类型的移动构造函数/赋值中。

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

std::move用于移动;std::forward用于转发。这听起来很油嘴滑舌,但这就是想法。如果您打算移动对象,则使用std::move. 如果您打算转发对象,请使用std::forward.

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

std::move 总是返回 &&。如果你给它一个左值引用,它会返回一个右值引用。如果你给它一个值类型,它会返回一个对该值的 r 值引用。等等。

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

于 2011-08-26T22:32:02.607 回答
1

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

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

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

于 2011-08-26T22:28:41.917 回答