C++ 将可修改的右值引用绑定到可修改的左值
我有3个问题:C++ 将可修改的右值引用绑定到可修改的左值,c++,reference,move-semantics,forward,rvalue,C++,Reference,Move Semantics,Forward,Rvalue,我有3个问题: 我可以将左值直接绑定到右值引用吗 正在执行std::move()的对象会发生什么情况 std::move和std::forward之间有什么区别 问题1。是的,编译器是正确的 问题2。什么也没发生标准::移动只是将内容强制转换为右值 但是,如果要使用std::move将mS(或myStr)传递到foo,则该函数可能会假设它可以“窃取”对象,因此mS可能在函数调用后处于未指定状态 问题1。是的,编译器是正确的 问题2。什么也没发生标准::移动只是将内容强制转换为右值 但是,如果要使
std::move()
的对象会发生什么情况std::forward
之间有什么区别问题1。是的,编译器是正确的 问题2。什么也没发生<代码>标准::移动只是将内容强制转换为右值
但是,如果要使用
std::move
将mS
(或myStr
)传递到foo
,则该函数可能会假设它可以“窃取”对象,因此mS
可能在函数调用后处于未指定状态 问题1。是的,编译器是正确的
问题2。什么也没发生<代码>标准::移动只是将内容强制转换为右值
但是,如果要使用std::move
将mS
(或myStr
)传递到foo
,则该函数可能会假设它可以“窃取”对象,因此mS
可能在函数调用后处于未指定状态
1> 我可以将左值直接绑定到右值引用吗
没有显式强制转换(即:std::move
)
2> 作为std::move()的对象会发生什么情况
在实际移动之前什么都没有。std::move
所做的就是返回一个r值引用,该值引用了您给它的值。实际移动发生在相关类型的移动构造函数/赋值中
3> std::move和std::forward之间有什么区别
std::move
用于移动<代码>标准::转发用于转发。这听起来很油腔滑调,但正是这个想法。如果要移动对象,请使用std::move
。如果要转发对象,请使用std::forward
转发使用专门的语义,允许在引用类型之间进行转换,以便在调用之间保留引用的性质。所有这些的细节都非常。。。技术的
std::move
始终返回一个&&。如果给它一个l值引用,它将返回一个r值引用。如果给它一个值类型,它将返回对该值的r值引用。等等
std::forward
并不总是返回&&。从语法上讲,std::forward
只是在做一个static\u cast
。但是,由于转换为&&类型的特殊语法,此转换并不总是返回&&。是的,这很奇怪,但它解决了转发问题,所以没人在乎。这就是为什么它包含在std::forward
中,而不必自己显式地执行静态转换
1> 我可以将左值直接绑定到右值引用吗
没有显式强制转换(即:std::move
)
2> 作为std::move()的对象会发生什么情况
在实际移动之前什么都没有。std::move
所做的就是返回一个r值引用,该值引用了您给它的值。实际移动发生在相关类型的移动构造函数/赋值中
3> std::move和std::forward之间有什么区别
std::move
用于移动<代码>标准::转发
用于转发。这听起来很油腔滑调,但正是这个想法。如果要移动对象,请使用std::move
。如果要转发对象,请使用std::forward
转发使用专门的语义,允许在引用类型之间进行转换,以便在调用之间保留引用的性质。所有这些的细节都非常。。。技术的
std::move
始终返回一个&&。如果给它一个l值引用,它将返回一个r值引用。如果给它一个值类型,它将返回对该值的r值引用。等等
std::forward
并不总是返回&&。从语法上讲,std::forward
只是在做一个static\u cast
。但是,由于转换为&&类型的特殊语法,此转换并不总是返回&&。是的,这很奇怪,但它解决了转发问题,所以没人在乎。这就是为什么它包含在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 ?
}