【问题标题】:How to avoid move elision when passing a temporary by value?按值传递临时值时如何避免移动省略?
【发布时间】:2015-04-08 11:53:47
【问题描述】:

在以下代码中:

Widget makeWidget()
{
    return Widget();
}

void foo(Widget widget)
{
   ...
}

foo(makeWidget());

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

【问题讨论】:

  • 我很好奇,你为什么要避免移动省略号?
  • 我只是想更好地理解C++。
  • 您在寻找 gcc 标志 -fno-elide-constructors 吗?

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 我脑子里有隐含的动作,所以没有 std::move。我已经编辑了我原来的问题。抱歉不够具体。
  • @rubix_addict:在那种情况下,我不知道你在问什么。如果您将临时值传递给具有相同参数类型的函数,则可以省略移动。没有没有被省略的例子。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2020-11-18
    • 2020-04-23
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多