为什么虚拟函数不能使用返回类型推导?

用户名

n3797说:

§7.1.6.4/14:

使用占位符类型声明为返回类型的函数不应是虚函数(10.3)。

因此,以下程序格式错误:

struct s
{
    virtual auto foo()
    {
    }
};

我所能找到的基本原理是n3638中的这个模糊的单线代码

虚拟的

可能允许对虚函数进行返回类型推导,但是这会使覆盖检查和vtable布局复杂化,因此似乎最好禁止这样做。

任何人都可以提供进一步的理由或给出一个与上述引用一致的好的(代码)示例吗?

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

您所包含的基本原理很明确:自然地,虚函数将被子类覆盖,因此,作为基类的设计者,您应该使继承您类的人尽可能地容易地提供适当的覆盖。但是,如果使用auto,则为重写确定返回类型对于程序员来说是一项繁琐的任务。编译器对此不会有太大的问题,但是人类会有很多机会感到困惑。

例如,如果您看到一个如下所示的return语句

return a * 3 + b;

你将不得不跟踪程序返回的声明的时候ab,弄不清类型的促销活动,并决定返回类型应该是什么。

语言设计者似乎发现这会造成混乱,因此决定不启用此功能。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么std :: is_invocable不能使用自动推导返回类型的模板化operator()(例如,通用lambda)

来自分类Dev

为什么不能使用memcmp()函数比较浮点类型?

来自分类Dev

为什么不能使用匿名函数返回颜色值?

来自分类Dev

为什么不能推导出main的返回类型?

来自分类Dev

为什么不能使用Void作为main方法的返回类型

来自分类Dev

为什么在返回类型为instancetype的方法上不能使用点语法?

来自分类Dev

为什么 lambda 不能使封闭函数返回?

来自分类Dev

函数不能使用类型推断,但是我不明白为什么

来自分类Dev

为什么在Haskell的typeclass定义中不能使用类型构造函数?

来自分类Dev

为什么不能使用将编译时常量作为常量返回的函数?

来自分类Dev

为什么不能使用函数的typedef来定义函数?

来自分类Dev

为什么不能使用`Show a => [Something-> a]`类型?

来自分类Dev

为什么不能使用long long int类型?C ++

来自分类Dev

为什么不能使用long long int类型?C ++

来自分类Dev

为什么返回引用时不能使用const?

来自分类Dev

为什么不能使用内联if语句返回?

来自分类Dev

为什么返回引用时不能使用const?

来自分类Dev

为什么我不能使用IO构造函数

来自分类Dev

为什么不能使用Lambda定义原型函数

来自分类Dev

为什么不能使用析构函数进行类化

来自分类Dev

为什么我的函数不能使用参数?

来自分类Dev

为什么不能自动成为函数的返回类型?

来自分类Dev

为什么clang ++不能推导lambda映射的类型?

来自分类Dev

为什么不能在函数中使用模板别名作为参数并自动推导?

来自分类Dev

为什么我必须强制转换为类型参数,而不能使用受约束的类型?

来自分类Dev

为什么PoolManager不能使用HTTPSConnectionPool?

来自分类Dev

为什么不能使用这样的struct?

来自分类Dev

为什么ckan不能使用中文?

来自分类Dev

为什么我不能使用asyncTask

Related 相关文章

  1. 1

    为什么std :: is_invocable不能使用自动推导返回类型的模板化operator()(例如,通用lambda)

  2. 2

    为什么不能使用memcmp()函数比较浮点类型?

  3. 3

    为什么不能使用匿名函数返回颜色值?

  4. 4

    为什么不能推导出main的返回类型?

  5. 5

    为什么不能使用Void作为main方法的返回类型

  6. 6

    为什么在返回类型为instancetype的方法上不能使用点语法?

  7. 7

    为什么 lambda 不能使封闭函数返回?

  8. 8

    函数不能使用类型推断,但是我不明白为什么

  9. 9

    为什么在Haskell的typeclass定义中不能使用类型构造函数?

  10. 10

    为什么不能使用将编译时常量作为常量返回的函数?

  11. 11

    为什么不能使用函数的typedef来定义函数?

  12. 12

    为什么不能使用`Show a => [Something-> a]`类型?

  13. 13

    为什么不能使用long long int类型?C ++

  14. 14

    为什么不能使用long long int类型?C ++

  15. 15

    为什么返回引用时不能使用const?

  16. 16

    为什么不能使用内联if语句返回?

  17. 17

    为什么返回引用时不能使用const?

  18. 18

    为什么我不能使用IO构造函数

  19. 19

    为什么不能使用Lambda定义原型函数

  20. 20

    为什么不能使用析构函数进行类化

  21. 21

    为什么我的函数不能使用参数?

  22. 22

    为什么不能自动成为函数的返回类型?

  23. 23

    为什么clang ++不能推导lambda映射的类型?

  24. 24

    为什么不能在函数中使用模板别名作为参数并自动推导?

  25. 25

    为什么我必须强制转换为类型参数,而不能使用受约束的类型?

  26. 26

    为什么PoolManager不能使用HTTPSConnectionPool?

  27. 27

    为什么不能使用这样的struct?

  28. 28

    为什么ckan不能使用中文?

  29. 29

    为什么我不能使用asyncTask

热门标签

归档