在以下代码中:
Widget makeWidget()
{
return Widget();
}
void foo(Widget widget)
{
...
}
foo(makeWidget());
Widget 对象将始终就地构造(在 foo 函数内部),因此不会发生移动构造(至少对于我尝试过的所有编译器)。以实际发生移动构造的方式(没有显式移动,即使用std :: move)将临时值传递给函数的简单示例是什么?
在以下代码中:
Widget makeWidget()
{
return Widget();
}
void foo(Widget widget)
{
...
}
foo(makeWidget());
Widget 对象将始终就地构造(在 foo 函数内部),因此不会发生移动构造(至少对于我尝试过的所有编译器)。以实际发生移动构造的方式(没有显式移动,即使用std :: move)将临时值传递给函数的简单示例是什么?
在这种情况下,省略的标准是:
当尚未绑定到引用的临时类对象将被复制/移动到具有相同 cv 非限定类型的类对象时
因此,防止省略的一种简单方法是将其绑定到引用:
foo(std::move(makeWidget());
Gcc-fno-elide-constructors
具有禁用复制省略的标志。使用该选项,这两个动作都将在您的示例代码中完成。