编辑:考虑以下2个示例:
std::string x;
{
std::string y = "extremely long text ...";
...
x = y; // *** (1)
}
do_something_with(x);
struct Y
{
Y();
Y(const Y&);
Y(Y&&);
... // many "heavy" members
};
struct X
{
X(Y y) : y_(std::move(y)) { }
Y y_;
}
X foo()
{
Y y;
...
return y; // *** (2)
}
在第 (1) 行和第 (2) 行的两个示例y
中,它的生命周期即将结束,即将被销毁。很明显,它可以被视为右值并在两种情况下都可以移动。在 (1) 中,它的内容可以移动到x
(2) 中的临时实例中X().y_
。
我的问题是:
1) 它会在上述任何一个例子中移动吗?(a) 如果是,根据什么标准规定。(b) 如果没有,为什么不呢?这是标准中的遗漏还是我没有想到的其他原因?
2)如果上述答案是否定的。在第一个示例中,我可以将 (1) 更改x = std::move(y)
为强制编译器执行移动。在第二个示例中我可以做什么来向编译器指示y
可以移动的内容?return std::move(y)
?
注意:我故意返回Y
而不是X
在 (2) 中的实例以避免 (N)RVO。