在我看来,任何函数式编程语言都是一个非常基本和必要的特性,可以知道函数调用的参数将被评估的顺序.我错了吗?为什么C++没有定义这个?是否正在讨论任何未来版本的C++?
Lig*_*ica 13
为什么C++不这样做呢?
对于初学者来说,C++ 不是一种函数式编程语言.
评估参数的最快方法取决于实现和体系结构,因此编译器可以选择.我们不会在C++中支付我们不使用的内容,因此如果您需要自己指定评估顺序,那么您可以使用命名变量显式地执行此操作.
尽管继续保留神圣C++范式的新标准的主题,C++ 17将遗憾地添加一些评估顺序保证,毁掉所有这些.
从C++ 17开始,它保证参数将被线性评估,并且不会交错但不以任何特定的顺序 - https://channel9.msdn.com/Shows/C9-GoingNative/GoingNative-52-ISO-C-Oulu-述职
它之前没有的原因是允许编译器实现者优化评估顺序的范围,结果是不使用或使用不当,逻辑顺序可以并且将被强制执行且影响可以忽略不计.
编辑:更正,谢谢@Oktalist
我实际上认为这是一个奇怪的决定,我觉得交错是一个比参数评估重新排序更容易的优化,我认为我们不会比以前更加信任对待参数评估.
C++ 不是函数式编程语言。事实上,在这种语言中(没有副作用),求值顺序无关紧要。
C++ 将尽可能多的实践留给编译器的实现,尤其是在可能出现优化机会的地方。在修复这样的问题之前,会咨询现有的编译器作者,看看是否有成本。
在 C++17 中添加了一些围绕重载运算符和完整参数规则的求值顺序保证。但仍然没有指定哪个参数先进行。在 C++17 中,现在指定给出调用内容的表达式((函数调用左侧的代码)在参数之前,并且首先计算的参数在下一个开始之前完全计算,并且在对象方法的情况下,对象的值在方法的参数之前被评估。(此描述中可能存在一些小错误:针对它提出一个狭隘的问题以获得更严格的答案)。
这些经过审查并确定不会对现有编译器造成重大问题。考虑过重新排序参数,然后放弃了,大概是有充分的理由。或者甚至是糟糕的理由,比如现有编译器有一个默认顺序,它可能会破坏(可能不合规)该编译器上的代码,以强制它们全部按照一个全局顺序执行。
简而言之,C++ 给编译器编写者留下了很大的自由。这让编译器编写者在奇怪的缝隙中找到了优化机会。今天可用的优化类型远远超出了 C 的原始作者,更不用说 C++,可能怀疑是实用的或被认为是合理的。
| 归档时间: |
|
| 查看次数: |
1333 次 |
| 最近记录: |