C++ 移动语义中似乎有很多错失的机会。我想了解这些背后的基本原理以及为什么标准在定义在以下情况下何时应该移动变量时没有更积极:
string f()
{
string s;
return s + " ";
}
这调用operator+(const string&, const char*)
,不是operator+(string&&, const char*)
,我相信因为s
是一个左值。标准不能说,在函数中最后一次使用局部变量时,该变量被认为是可移动的吗?
我认为一个有点类似的例子:
struct A { A(string&&); };
string g()
{
string s;
return s; // s is moved
}
A h()
{
string s;
return s; // s can't be moved!
}
g
使用 move 语义将数据从s
返回值移动,但由于未移入而h
无法编译。我相信这是因为标准有一个特殊情况,它本质上说如果你返回一个与返回类型完全相同类型的局部变量,该变量就会被移动。为什么如果返回一个局部变量,不管它的类型如何,它都会被移动?s
h
g