是否需要使用右值引用重复调用 move?
Is repeatedly calling move with rvalue references necessary?
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));
}
假设您在 main()
中调用 move
来调用右值引用方法,是否有必要在 A & B & C 行中重复对 move()
的额外调用?您已经有了右值引用,那么它在有和没有的那些行中有什么不同吗?
我在 Bar 的 operator=
中理解这是必要的,因为您在技术上移动 m_Val
而不是 _other
本身正确吗?
注意:最初,我错误地将右值引用称为右值参数。我很抱歉。我已经更正了这一点,以使问题更容易找到并更清楚。
Give that you're calling move
in main()
to invoke the rvalue parameter methods, is it necessary in lines A & B & C to repeat an additional call to move()
?
是的。你所说的 rvalue parameter 实际上是一个右值引用。就像左值引用一样,它是其使用范围内的左值。这意味着您需要使用 move
将其转换回右值,以便移动而不是复制。请记住,如果对象有名称,它是一个左值。
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));
}
假设您在 main()
中调用 move
来调用右值引用方法,是否有必要在 A & B & C 行中重复对 move()
的额外调用?您已经有了右值引用,那么它在有和没有的那些行中有什么不同吗?
我在 Bar 的 operator=
中理解这是必要的,因为您在技术上移动 m_Val
而不是 _other
本身正确吗?
注意:最初,我错误地将右值引用称为右值参数。我很抱歉。我已经更正了这一点,以使问题更容易找到并更清楚。
Give that you're calling
move
inmain()
to invoke the rvalue parameter methods, is it necessary in lines A & B & C to repeat an additional call tomove()
?
是的。你所说的 rvalue parameter 实际上是一个右值引用。就像左值引用一样,它是其使用范围内的左值。这意味着您需要使用 move
将其转换回右值,以便移动而不是复制。请记住,如果对象有名称,它是一个左值。