struct Bar
{
Bar(std::string&& val)
: m_Val(std::move(val)) {} // A
Bar& operator=(Bar&& _other) { m_Val = std::move(_other.m_Val); }
std::string m_Val;
}
struct Foo
{
void Func1(Bar&& param)
{
Func2(std::move(param)) // B
}
void Func2(Bar&& param)
{
m_Bar = std::move(param); // C
}
Bar m_Bar;
};
void main()
{
Foo f;
std::string s = "some str";
Bar b(std::move(s));
f.Func1(std::move(b));
}
鉴于您要在move
中调用main()
来调用右值引用方法,是否有必要在A&B&C行中重复对move()
的附加调用?您已经有了右值引用,那么在有无vs的那些行中,它有什么不同之处吗?
我在Bar的operator=
中了解到这是必要的,因为您实际上是在移动m_Val
而不是_other
本身正确吗?
注意:最初,我错误地将右值引用称为右值参数。我很抱歉。我已对此进行更正,以使问题更易于查找和阐明。
答案 0 :(得分:12)
鉴于您要在
move
中调用main()
来调用rvalue参数方法,是否有必要在A&B&C行中重复对move()
的附加调用? / p>
是的。您所说的 rvalue参数实际上是一个右值引用。就像左值引用一样,它在使用范围内也是左值。这意味着您需要使用move
将其强制转换为右值,以便移动而不是复制。请记住,如果对象具有名称,则为左值。