【发布时间】:2012-11-04 20:43:46
【问题描述】:
我一直在玩 c++11 移动语义
在代码中...
#include <vector>
#include <string>
std::vector<std::string> GetNewVector()
{
std::vector<std::string> newVec;
newVec.push_back(std::string("hello")); //(1)
newVec.push_back(std::string("whey")); //(2)
return newVec;
}
int main(int argc, char* argv[])
{
std::vector<std::string> vec = GetNewVector();
}
在点 (1) 处,“hello”对象的移动构造函数在对象移动到向量中时被调用。
在第 (2) 点,首先再次调用“hello”的移动构造函数(我假设这是向量重新分配的位置),然后调用“乳清”移动构造函数。
这一切都符合预期,但是我希望在GetNewVector() 末尾返回向量时再次移动对象,但是不会再次调用移动构造函数。我的猜测是 RVO 正在发生,但是当我在调试模式下运行 Visual Studio (2k10) 时,我不确定这是否会发生?
如果可以执行RVO,那么它是否会优先于使用移动构造函数?
【问题讨论】:
-
这是什么语言? TString (CERN ROOT?) std::vector 没有指定类型?
-
你所拥有的是逻辑上的副本,而不是移动。要采取行动,您必须执行
return std::move(newVec)。 -
@VaughnCato:糟糕糟糕糟糕!在此处使用
std::move会禁止RVO,并且标准已经规定编译器首先必须尝试移动newVec,并且只有在移动失败时才复制它。 -
@Xeo:我并不是要暗示你想要那样做。
-
@VaughnCato:我在评论中试图解释的是,如果未应用 NRVO,
return a_local_variable;将已经执行移动。
标签: c++ c++11 move-semantics