【发布时间】:2017-08-22 10:34:09
【问题描述】:
我正在阅读这个问题:
Undefined behavior and sequence points
特别是C++11 answer,我理解评估“排序”的概念。但是——我写的时候有没有足够的顺序:
f(x++), g(x++);?
也就是说,我是否保证f() 获得x 的原始值,而g() 获得一次递增的x?
吹毛求疵者的注意事项:
- 假设
operator++()已定义行为(即使我们已覆盖它),f()和g()也已定义行为,不会引发异常等 - 这个问题与此无关。李> - 假设
operator,()没有过载。
【问题讨论】:
-
是的,对于内置的
,运算符。如果,运算符是用户定义的,则否。见:en.cppreference.com/w/cpp/language/…(随着 C++17 的变化) -
如果您将逗号更改为分号,则可以保证。 :-)
-
@BoPersson:另外,如果我在表达式前面加上
abort();,但这不是很有帮助,是吗? -
在 N4659 中,
operator,( f(x++), g(x++) );不是 UB,并且(例如 x == 0 事先)要么先调用f(0),然后再调用g(1),或者先调用g(0),然后再调用f(1);然后离开x == 2。有人提出函数调用有严格的左右评估,但据我所知,这并没有发生 -
@snb:完全没有,请在标记为骗子之前仔细阅读问题和潜在的骗子。 (提示:另一个问题是在哪一年提出的?)
标签: c++ c++11 expression undefined-behavior