这种关系不等于定义良好的表达式吗?

Is this relational not equal to expression well defined?

本文关键字:表达式 关系 不等于 定义      更新时间:2023-10-16

考虑一个类Foofoo是其中的实例。

Foo有一个函数calculate(),该函数更改watermark()是其"getter"的内部成员,并返回与该内部成员类型相同的内容。

是表达式

foo.calculate() != foo.watermark()

定义明确。也就是说,calculate()必须在watermark()被召唤之前发生吗?

换句话说,评价顺序是严格foo.calculate(),后跟foo.watermark()后跟!=吗?

两者之间没有顺序点,评估顺序未指定。

您必须强制序列,例如:

const auto& res = foo.calculate();
res != foo.watermark();

C++标准(ISO/IEC 14882:2014(说:

之前排序的是一种不对称的、传递的、成对的关系 在单个线程执行的评估之间,这会导致 这些评价中的部分顺序。给定任意两个评估 A 和 B,如果 A 在 B 之前排序,则 A 的执行应先于如果 A 未在 B 之前排序且 B 未排序 在 A 之前排序,然后 A 和 B 未排序。评价 A 和 当 A 在 B 之前排序或 B 在 A 之前排序,但未指定哪个。

不允许同一标量对象出现在未排序或不确定排序操作的两半的副作用或值计算中。

参考链接在这里。

它可能会有所帮助: http://en.cppreference.com/w/cpp/language/eval_order

未指定几乎所有C++运算符的操作数的计算顺序(包括函数调用表达式中函数参数的计算顺序和任何表达式中子表达式的计算顺序(。编译器可以按任意顺序计算操作数,并且可以在再次计算同一表达式时选择其他顺序。