我对以下代码段中的内容感到困惑。这里真的需要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()
答案 0 :(得分:6)
首先,该集不是临时,而是本地。
其次,返回它的正确方法是通过return words;
。
这不仅是允许返回值优化的唯一方法,而且,局部变量也将绑定到(异常)情况下返回对象的移动构造函数,其中副本不会完全省略。所以这是一个真正的三赢场景。
答案 1 :(得分:3)
这里没有必要使用移动。只需返回“单词”即可。它将参与所谓的“回报价值优化”。
C ++ 11标准中的第12.8节要求在返回局部变量的情况下调用移动构造函数(如果存在)。本质上,编译器将负责为您调用std :: move。
答案 2 :(得分:2)
不,显式move
不一定是移动set
的最佳方式。由于set
是按值返回的,因此编译器可以在set
上执行命名的返回值优化,这意味着它可能会删除副本并直接构造set
在要存储返回值的调用站点就地。明确的移动会抑制这一点。