如何在传递临时值时避免移动省略?

时间:2015-04-08 11:53:47

标签: c++ move-semantics copy-elision

在以下代码中:

Widget makeWidget()
{
    return Widget();
}

void foo(Widget widget)
{
   ...
}

foo(makeWidget());

Widget对象将始终就地构建(在foo函数内部),因此不会进行移动构造(至少对于我尝试过的所有编译器)。什么是通过值以实际移动构造的方式将临时函数传递给函数的简单示例(没有明确移动,即使用std :: move)?

2 个答案:

答案 0 :(得分:3)

在这种情况下,elision的标准是:

  

当一个尚未绑定到引用的临时类对象被复制/移动到具有相同cv-unqualified类型的类对象时

因此,防止elision的一种简单方法是将其绑定到引用:

foo(std::move(makeWidget());

答案 1 :(得分:0)

Gcc有一个标志-fno-elide-constructors,可以禁用复制省略。使用该选项,两个移动都将在您的示例代码中完成。