为什么constexpr不能只是默认值?

罗伯特·拉米(Robert Ramey)

constexpr 允许可以在编译时求值的表达式在编译时求值。

为什么甚至需要这个关键字?为什么不允许或要求编译器在编译时评估所有表达式?

标准库的constexpr应用程序不均衡,这会带来很多不便。将constexpr设置为“默认”将解决该问题,并可能会改善大量现有代码。

马克·维

注意:尽管有以下情况,我还是同意将constexpr设置为默认值。但是您问为什么还没有完成,所以要回答一下,我将简单介绍一下mattnewport的最后评论:

考虑今天的情况。您试图在需要常量表达式的上下文中使用标准库中的某些函数。它没有标记为constexpr,因此会出现编译器错误。这似乎是愚蠢的,因为要使其正常工作,唯一需要更改的就是在定义中添加constexpr一词。

现在考虑我们采用您的建议的替代宇宙中的生活。您的代码现在可以编译了,是的!明年,您决定将Windows支持添加到您正在从事的任何项目中。它能有多难?您将为Windows用户使用Visual Studio进行编译,并为其他所有人继续使用gcc,对吗?

但是,当您第一次尝试在Windows上进行编译时,会遇到很多编译器错误:该函数不能在常量表达式上下文中使用。您查看有问题的函数的代码,并将其与gcc附带的版本进行比较。事实证明,它们稍有不同,并且gcc附带的版本完全出于偶然而满足constexpr的技术要求,同样,Visual Studio附带的版本出于偶然性而又不满足那些要求。怎么办?

没问题,我将向Microsoft提交错误报告:此功能应该已修复。他们关闭了您的错误报告:标准从不说该函数必须在常量表达式中可用,因此我们可以根据需要实现。因此,您向gcc维护者提交了错误报告:为什么不警告我我在使用不可移植的代码?他们也关闭了它:我们应该怎么知道它不是便携式的?我们无法跟踪其他人如何实现标准库。

怎么办?没有人真正做错任何事情。不是您,不是gcc的人,也不是Visual Studio的人。但是,您仍然会遇到无法移植的代码,并且在这一点上还不是一个快乐的露营者。在所有其他条件相同的情况下,良好的语言标准将尝试使这种情况尽可能少发生。

即使我使用了不同编译器的示例,当您尝试升级到同一编译器的较新版本,甚至尝试使用不同的设置进行编译时,也可能会发生这种情况。例如:该函数包含一个assert语句,以确保使用有效的参数对其进行调用。如果在禁用断言的情况下进行编译,则断言“消失”并且该函数符合constexpr的规则;如果启用断言,那么它将不符合它们。(现在,由于constexpr的规则非常宽泛,这在今天变得不太可能了,但是在C ++ 11规则下这是一个更大的问题。但是原则上讲,这一点直到今天仍然存在。)

最后,我们来看看公认的次要错误消息。在当今世界,如果我尝试cout在constexpr函数中的语句中做一些事情,我马上就会收到一个很好的简单错误。在您的世界中,我们将拥有与模板相同的情况,从深层堆栈跟踪一直到输出流实现的最底层。不是致命的,但肯定令人讨厌。

这已经迟了一年半了,但是我仍然希望它能有所帮助。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么constexpr不是所有函数的默认值?

来自分类Dev

为什么需要默认值呢?

来自分类Dev

为什么nullglob不是默认值?

来自分类Dev

为什么不能将默认值作为null以外的可选参数提供?

来自分类Dev

定义函数后,为什么不能更改其默认值?

来自分类Dev

HSQLDB-为什么我不能将默认值设置为-1

来自分类Dev

为什么不能将默认值作为null以外的可选参数提供?

来自分类Dev

为什么我们不能用默认值声明常量?

来自分类Dev

为什么在实现中允许使用与在接口上定义的默认值不同的默认值?

来自分类Dev

为什么RandomForestClassifier中的max_features的默认值与RandomForestRegressor中的默认值不同?

来自分类Dev

为什么在访问结构时需要默认值?

来自分类Dev

Java:为什么未使用XX:SurvivorRatio的默认值?

来自分类Dev

为什么要推动匹配Git中的默认值?

来自分类Dev

为什么out参数没有默认值?

来自分类Dev

使用:=时,为什么with = TRUE是默认值?

来自分类Dev

为什么我的argparse不显示默认值?

来自分类Dev

为什么我的DropDownListFor的默认值无法正常工作?

来自分类Dev

TEXT列的MySQL默认值行为异常,为什么?

来自分类Dev

为什么FreezeGun不使用SQLAlchemy默认值?

来自分类Dev

为什么Mockito verifyNoMoreInteractions的Scala默认值有问题

来自分类Dev

为什么可选参数的默认值必须为常数?

来自分类Dev

为什么打印屏幕采用默认值

来自分类Dev

为什么`ffmpeg`的`-hide_banner`不是默认值?

来自分类Dev

为什么需要“-人类可读”而不是默认值?

来自分类Dev

express-locale始终返回默认值-为什么?

来自分类Dev

为什么 <value>!0</value> 匹配默认值 0?

来自分类Dev

为什么在注释中禁止 null 作为默认值?

来自分类Dev

为什么main不能是constexpr?

来自分类Dev

为什么main不能是constexpr?

Related 相关文章

  1. 1

    为什么constexpr不是所有函数的默认值?

  2. 2

    为什么需要默认值呢?

  3. 3

    为什么nullglob不是默认值?

  4. 4

    为什么不能将默认值作为null以外的可选参数提供?

  5. 5

    定义函数后,为什么不能更改其默认值?

  6. 6

    HSQLDB-为什么我不能将默认值设置为-1

  7. 7

    为什么不能将默认值作为null以外的可选参数提供?

  8. 8

    为什么我们不能用默认值声明常量?

  9. 9

    为什么在实现中允许使用与在接口上定义的默认值不同的默认值?

  10. 10

    为什么RandomForestClassifier中的max_features的默认值与RandomForestRegressor中的默认值不同?

  11. 11

    为什么在访问结构时需要默认值?

  12. 12

    Java:为什么未使用XX:SurvivorRatio的默认值?

  13. 13

    为什么要推动匹配Git中的默认值?

  14. 14

    为什么out参数没有默认值?

  15. 15

    使用:=时,为什么with = TRUE是默认值?

  16. 16

    为什么我的argparse不显示默认值?

  17. 17

    为什么我的DropDownListFor的默认值无法正常工作?

  18. 18

    TEXT列的MySQL默认值行为异常,为什么?

  19. 19

    为什么FreezeGun不使用SQLAlchemy默认值?

  20. 20

    为什么Mockito verifyNoMoreInteractions的Scala默认值有问题

  21. 21

    为什么可选参数的默认值必须为常数?

  22. 22

    为什么打印屏幕采用默认值

  23. 23

    为什么`ffmpeg`的`-hide_banner`不是默认值?

  24. 24

    为什么需要“-人类可读”而不是默认值?

  25. 25

    express-locale始终返回默认值-为什么?

  26. 26

    为什么 <value>!0</value> 匹配默认值 0?

  27. 27

    为什么在注释中禁止 null 作为默认值?

  28. 28

    为什么main不能是constexpr?

  29. 29

    为什么main不能是constexpr?

热门标签

归档