C++为什么不要让执行结果受函数参数的求值次序影响​

这篇文章主要讲解了“C++为什么不要让执行结果受函数参数的求值次序影响”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++为什么不要让执行结果受函数参数的求值次序影响”吧!

ES.44: 不要让执行结果受函数参数的求值次序影响

Reason(原因)

Because that order is unspecified.

因为函数参数的求值次序是无定义的。

Note(注意)

C++17 tightens up the rules for the order of evaluation, but the order of evaluation of function arguments is still unspecified.

C++17收紧了运算次序规则,但是函数参数的求值次序依然是无定义的。

Example(示例)

int i = 0;
f(++i, ++i);

调用的结果很可能是f(0,1)或者f(1,0),但是不知道会是哪一个。技术上,这个行为是无定义的。在C++17中,这段代码不会是一个无定义的行为,但是依然没有明确那个参数先求值。

Example(示例)

Overloaded operators can lead to order of evaluation problems:

重载的运算符可能引入计算次序的问题。

f1()->m(f2());          // m(f1(), f2())
cout << f1() << f2();   // operator<<(operator<<(cout, f1()), f2())

In C++17, these examples work as expected (left to right) and assignments are evaluated right to left (just as ='s binding is right-to-left)

在C++17中,这些代码示例可以像期待的那样执行(从左向右),同时赋值会从右向左计算(就像赋值运算符=绑定了从右向左计算次序)

f1() = f2();    // undefined behavior in C++14; in C++17, f2() is evaluated before f1()

Enforcement(实施建议)

Can be detected by a good analyzer.

这个问题可以被实现良好的代码解析器检出。

感谢各位的阅读,以上就是“C++为什么不要让执行结果受函数参数的求值次序影响”的内容了,经过本文的学习后,相信大家对C++为什么不要让执行结果受函数参数的求值次序影响这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!