为什么c ++没有用于评估函数争论的指定顺序?

jDo*_*ogg 5 c++ c++11 c++14

在我看来,任何函数式编程语言都是一个非常基本和必要的特性,可以知道函数调用的参数将被评估的顺序.我错了吗?为什么C++没有定义这个?是否正在讨论任何未来版本的C++?

Lig*_*ica 13

为什么C++不这样做呢?

对于初学者来说,C++ 不是一种函数式编程语言.

评估参数的最快方法取决于实现和体系结构,因此编译器可以选择.我们不会在C++中支付我们不使用的内容,因此如果您需要自己指定评估顺序,那么您可以使用命名变量显式地执行此操作.

尽管继续保留神圣C++范式的新标准的主题,C++ 17将遗憾地添加一些评估顺序保证,毁掉所有这些.

  • @Yakk:不,我只是反对评估订单保证的种族主义者:) (5认同)
  • 为什么只是反对我的评价'保证Naor hder? (3认同)
  • 可悲的是?其中一些案例允许某些习语(已经在使用中)不被定义.您是否反对所有增加的评估订单保证,或某些特定的? (2认同)

The*_*Kid 9

从C++ 17开始,它保证参数将被线性评估,并且不会交错但不以任何特定的顺序 - https://channel9.msdn.com/Shows/C9-GoingNative/GoingNative-52-ISO-C-Oulu-述职

它之前没有的原因是允许编译器实现者优化评估顺序的范围,结果是不使用或使用不当,逻辑顺序可以并且将被强制执行且影响可以忽略不计.

编辑:更正,谢谢@Oktalist

我实际上认为这是一个奇怪的决定,我觉得交错是一个比参数评估重新排序更容易的优化,我认为我们不会比以前更加信任对待参数评估.

  • 给定`(a,b)`C++ 17说'o`在`f`之前进行评估,在`a`和`b`之前进行评估,`a`和`b`的子表达式不会交错,但仍未指定评估"a"和"b"的顺序. (5认同)
  • 关于您的编辑,我认为我们的目的不是为了让我们对评估顺序有比以前更多的信任,而是为了标准化每个人(包括专家)已经错误地信任的东西。优化前的正确性。 (2认同)

Yak*_*ont 5

C++ 不是函数式编程语言。事实上,在这种语言中(没有副作用),求值顺序无关紧要。

C++ 将尽可能多的实践留给编译器的实现,尤其是在可能出现优化机会的地方。在修复这样的问题之前,会咨询现有的编译器作者,看看是否有成本。

在 C++17 中添加了一些围绕重载运算符和完整参数规则的求值顺序保证。但仍然没有指定哪个参数先进行。在 C++17 中,现在指定给出调用内容的表达式((函数调用左侧的代码)在参数之前,并且首先计算的参数在下一个开始之前完全计算,并且在对象方法的情况下,对象的值在方法的参数之前被评估。(此描述中可能存在一些小错误:针对它提出一个狭隘的问题以获得更严格的答案)。

这些经过审查并确定不会对现有编译器造成重大问题。考虑过重新排序参数,然后放弃了,大概是有充分的理由。或者甚至是糟糕的理由,比如现有编译器有一个默认顺序,它可能会破坏(可能不合规)该编译器上的代码,以强制它们全部按照一个全局顺序执行。

简而言之,C++ 给编译器编写者留下了很大的自由。这让编译器编写者在奇怪的缝隙中找到了优化机会。今天可用的优化类型远远超出了 C 的原始作者,更不用说 C++,可能怀疑是实用的或被认为是合理的。