我试图更好地理解 LValue、RValue 以及 std::move 的工作原理。我有以下代码
#include <string>
class A
{
public:
A() = default;
A(std::string&& aString): myString(std::move(aString)) {}
std::string myString;
};
class B
{
public:
void InitMembers(std::string& aString) { myA = A(std::move(aString));}
private:
A myA;
};
int main()
{
B b;
std::string hello;
b.InitMembers(hello);
}
我的问题是:
- 据
void InitMembers(string& aString) { myA = A(std::move(aString));}
我所知,我必须使用 std::move 到 aString 才能将 aString 从 LValue 引用转换为 RValue 引用。但是我对 InitMember 范围内的 aString 的含义有些怀疑。aString 作为 LValue 引用提供,但在方法范围内它被视为 LValue,这就是为什么我必须使用 std::move? Std::move 应该依赖于引用推导(对吗?),在这种情况下它如何推导类型?它会推导出一个类型“字符串”或“字符串&”,因为 aString 是作为方法参数中的 LValue 引用提供的? - 为什么我还必须在 A 的构造函数初始化程序中使用 std::move?aString 是触发移动构造函数的 RValue 引用这一事实还不够吗?
下面的实现不是和上面的一样好吗?
#include <string>
class A
{
public:
A() = default;
A(std::string& aString): myString(std::move(aString)) {}
std::string myString;
};
class B
{
public:
void InitMembers(std::string& aString) { myA = A(aString);}
private:
A myA;
};
int main()
{
B b;
std::string hello;
b.InitMembers(hello);
}
谢谢 :)