1

我想我可以试试移动语义。因此,我捕捉到了 Scott Meyers 谈论移动语义的非常粗糙/低分辨率的视频,尽管所述视频中的代码不可读。

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

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

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

为此,我可能会编写一个移动函数,例如:

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

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

问题

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

例如MoveList( {string("c"), string("b"), string("a")} )无效。

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

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

4

2 回答 2

0

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

如果你想创建一个临时的测试,一旦你的编译器完全支持初始化列表,上面列出的应该可以工作。现在,您可以创建一个返回 a 的函数std::vector<std::string>或简单地创建一个非临时向量并使用std::move

于 2012-05-17T21:43:17.083 回答
0

如果您的编译器不支持初始化列表,您可以使用以下命令创建空右值向量:

MoveList(vector<string>());

或非空右值:

vector<string>  lv_vec; 
lv_vec = ...
MoveList(vector<string>(lv_vec));
于 2012-05-25T10:46:12.503 回答