gpt4 book ai didi

c++ - 将可修改右值引用绑定(bind)到可修改左值

转载 作者:行者123 更新时间:2023-11-30 02:08:09 28 4
gpt4 key购买 nike

我有 3 个问题:

  1. 我可以将左值直接绑定(bind)到右值引用吗?

  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>Can I bind a lvalue directly to a rvalue reference ?

并非没有显式转换(即:std::move)。

2>What happens to the object that being std::move() ?

在实际 move 之前什么都没有。全部std::move做的是返回一个右值引用到你给它的东西。实际 move 发生在相关类型的 move 构造函数/赋值中。

3>What's the difference between std::move and std::forward ?

std::move是为了搬家; std::forward用于转发。这听起来很油嘴滑舌,但这就是想法。如果您打算 move 一个对象,那么您可以使用 std::move .如果您打算转发一个对象,请使用 std::forward .

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

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

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

关于c++ - 将可修改右值引用绑定(bind)到可修改左值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7211019/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com