4

我对以下代码片段中发生的事情感到困惑。move这里真的有必要吗?返回临时集的最佳+安全方式是什么?

set<string> getWords()
{
    set<string> words;

    for (auto iter = wordIndex.begin(); iter != wordIndex.end(); ++iter)
    {
        words.insert(iter->first);
    }

    return move(words);
}

我的调用代码只是set<string> words = foo.getWords()

4

3 回答 3

6

首先,设置不是临时的,而是本地的。

其次,返回它的正确方法是 via return words;

这不仅是您允许返回值优化的唯一方法,而且,在副本没有完全省略的(不寻常)情况下,局部变量还将绑定到返回对象的移动构造函数。所以这是一个真正的三赢局面。

于 2012-10-01T00:45:18.147 回答
3

此处无需使用 move 。只需返回“单词”。它将参与所谓的“回报价值优化”。

C++11 标准中的第 12.8 节要求在返回局部变量的情况下调用移动构造函数(如果存在)。本质上,编译器会为你调用 std::move。

于 2012-10-01T00:48:44.033 回答
2

不,显式move不一定是移动set. 由于set是按值返回的,编译器可以对 执行命名返回值优化set这意味着它可以省略副本并直接set在要存储返回值的调用站点就地构造。显式移动会抑制这一点。

于 2012-10-01T00:44:44.837 回答