通过值传递临时时如何避免移动省略

How to avoid move elision when passing a temporary by value?

本文关键字:何避免 移动省 值传      更新时间:2023-10-16

在以下代码中:

Widget makeWidget()
{
    return Widget();
}
void foo(Widget widget)
{
   ...
}
foo(makeWidget());

Widget对象将始终在适当的位置构建(在foo函数内部),因此不会进行移动构建(至少在我尝试过的所有编译器中)。以移动构造实际发生的方式(不显式移动,即使用std::move)将临时值传递给函数的简单示例有哪些?

在这种情况下省略的标准是:

当尚未绑定到引用的临时类对象将被复制/移动到具有相同cv不合格类型的类对象时

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

foo(std::move(makeWidget());
Gcc具有禁用复制省略的标志-fno-elide-constructors。有了这个选项,这两个动作都将在示例代码中完成。