实用的r值参考

时间:2012-05-17 21:34:34

标签: c++ c++11 rvalue-reference move-semantics

我想我可能会尝试移动语义。所以我抓到了一个非常grainy/lowres video of Scott Meyers talking about move semantics,虽然所述视频中的代码是不可读的。

所以我写了一个包含字符串向量的丢弃类。

class ShoppingList
{
private:
    vector<string> m_vsList;
public:
    ...
};

我想知道是否可以使用移动语义将字符串的临时向量移动到成员变量m_vsList中?

为了实现这一点,我可能会编写一个移动函数,如:

void MoveList( vector<string> && r )
{
    m_vsList = std::move(r);
}

我应该声明我在VS2011 beta编译器上尝试这个。

问题

这是正确/可能吗?如果是,我如何指定临时vector<string>

e.g。 MoveList( {string("c"), string("b"), string("a")} )无效。

我应该限制移动语义来移动构造函数和/或移动赋值重载吗?

如果我std ::进入m_vsList并且m_vsList已经包含数据,该数据会发生什么,它是否泄漏?那么我应该在移动之前明确地清除该向量吗?

2 个答案:

答案 0 :(得分:0)

是的,这是正确的,也是可能的。请参阅启用了rvalue的std::map::operator[] (Key&& key)版本。

如果要创建临时测试,一旦编译器完全支持初始化列表,上面列出的内容就应该有效。现在,您可以创建一个返回std::vector<std::string>的函数,或者只创建一个非临时向量并使用std::move

答案 1 :(得分:0)

如果编译器不支持初始化列表,则可以使用:

创建空的右值向量
MoveList(vector<string>());

或非空rvalue:

vector<string>  lv_vec; 
lv_vec = ...
MoveList(vector<string>(lv_vec));