繁体   English   中英

c ++ std :: move confusion

[英]c++ std::move confusion

我对以下代码片段中发生的事情感到困惑。 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()

首先,该集合不是暂时的 ,而是本地的

第二,返回它的正确方法是通过return words;

这不仅是允许返回值优化的唯一方法,而且,局部变量也将绑定到(异常)情况下返回对象的移动构造函数,其中副本不会完全省略。 所以这是一个真正的三赢场景。

这里没有必要使用移动。 只需返回“单词”即可。 它将参与所谓的“回报价值优化”。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM