为什么在此示例中自动返回类型会丢失移动语义?

无意义

我正在观看视频,其中Nicolai表示此示例中auto失去了动作的语义:

template<typename Callable, typename... Args>
auto call(Callable&& op, Args&&... args) {
return std::invoke(std::forward<Callable>(op), std::forward<Args>(args)...);
}

我在想:

  1. 为什么会这样呢?

  2. 在此示例保证RVO踢吗?如果是这样,担心搬家的目的是什么?

讲故事的人-Unslander Monica

我认为Nicolai可以说得更好一些。

当返回by时auto,您的函数将返回一个(将推导其类型)。如果std::invoke返回纯rvalue或xvalue,则当然call将相应地构造结果(如果可能,通过移动)。从这个意义上讲,我们不会“失去语义”。

但是,当我们按值返回时,需要创建该值对象。可以通过移动来创建它,并且在某些情况下(此处不存在)可以被删除,但是必须创建它。有保证的复制省略不允许我们退出创建此对象的过程。

如果std::invoke给我们返回一个xvalue(对某物的rvalue引用),那将是非常浪费的我们为什么要构造一个对象以返回它?

这就是为什么一两张幻灯片之后他说我们应该回去的原因decltype(auto)然后,推导规则将保留对以下调用的值类别std::invoke

  1. 如果它返回一个值,我们的情况不会更糟。我们自己call将返回一个值(它可以通过移动的返回值来创建std::invoke)。

  2. 如果std::invoke返回一个左值(X&)或左值(X&&,则将按原样返回,而无需通过复制或移动来创建另一个对象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在此示例中附加自动筛选会损坏我的excel文件?

来自分类Dev

为什么在此示例中参数b具有类型a?

来自分类Dev

为什么在此示例中可以返回临时对象?

来自分类Dev

为什么返回在golang中实现错误接口的类型会自动调用Error()方法?

来自分类Dev

为什么在此示例中StateT更快?

来自分类Dev

为什么在此示例中需要括号?

来自分类Dev

在此示例中,为什么必须通过emplace_back进行移动?

来自分类Dev

为什么在此scala代码段中,编译器会丢失有效负载的类型[P]?如何制作此代码段?

来自分类Dev

为什么在此示例中图形大小(y 轴)会波动?

来自分类Dev

为什么溢出隐藏会影响高度,在此示例中如何解决?

来自分类Dev

为什么在此示例中按位运算符OR会截断该值?

来自分类Dev

为什么从函数返回联合类型时类型推断会丢失?

来自分类Dev

为什么删除的移动语义会导致std :: vector问题?

来自分类Dev

这些自定义返回类型在此C#示例中做什么?

来自分类Dev

为什么不使用自动返回类型在此函数中使用clang删除副本?

来自分类Dev

为什么地板在此示例中返回少了一个元素

来自分类Dev

为什么返回类型的操作重载是示例

来自分类Dev

在此示例中,Java的返回类型有何处理?

来自分类Dev

什么是AllowAmbiguousTypes,为什么在此“ forall”示例中需要它?

来自分类Dev

在此示例中,Coq的类型系统在做什么?

来自分类Dev

为什么指针在此Go程序中丢失其值

来自分类Dev

为什么const在此模板结构中丢失?

来自分类Dev

为什么在此示例中Map会有return语句?

来自分类Dev

为什么SFINAE在此示例中无法按预期工作?

来自分类Dev

为什么在此示例中命令注入不起作用?

来自分类Dev

为什么tsort在此示例中不报告任何循环?

来自分类Dev

为什么在此示例中ArrayAdapter始终为null?

来自分类Dev

为什么git revert在此示例中失败?

来自分类Dev

为什么在此示例代码中不需要 readSync?

Related 相关文章

  1. 1

    为什么在此示例中附加自动筛选会损坏我的excel文件?

  2. 2

    为什么在此示例中参数b具有类型a?

  3. 3

    为什么在此示例中可以返回临时对象?

  4. 4

    为什么返回在golang中实现错误接口的类型会自动调用Error()方法?

  5. 5

    为什么在此示例中StateT更快?

  6. 6

    为什么在此示例中需要括号?

  7. 7

    在此示例中,为什么必须通过emplace_back进行移动?

  8. 8

    为什么在此scala代码段中,编译器会丢失有效负载的类型[P]?如何制作此代码段?

  9. 9

    为什么在此示例中图形大小(y 轴)会波动?

  10. 10

    为什么溢出隐藏会影响高度,在此示例中如何解决?

  11. 11

    为什么在此示例中按位运算符OR会截断该值?

  12. 12

    为什么从函数返回联合类型时类型推断会丢失?

  13. 13

    为什么删除的移动语义会导致std :: vector问题?

  14. 14

    这些自定义返回类型在此C#示例中做什么?

  15. 15

    为什么不使用自动返回类型在此函数中使用clang删除副本?

  16. 16

    为什么地板在此示例中返回少了一个元素

  17. 17

    为什么返回类型的操作重载是示例

  18. 18

    在此示例中,Java的返回类型有何处理?

  19. 19

    什么是AllowAmbiguousTypes,为什么在此“ forall”示例中需要它?

  20. 20

    在此示例中,Coq的类型系统在做什么?

  21. 21

    为什么指针在此Go程序中丢失其值

  22. 22

    为什么const在此模板结构中丢失?

  23. 23

    为什么在此示例中Map会有return语句?

  24. 24

    为什么SFINAE在此示例中无法按预期工作?

  25. 25

    为什么在此示例中命令注入不起作用?

  26. 26

    为什么tsort在此示例中不报告任何循环?

  27. 27

    为什么在此示例中ArrayAdapter始终为null?

  28. 28

    为什么git revert在此示例中失败?

  29. 29

    为什么在此示例代码中不需要 readSync?

热门标签

归档