【发布时间】:2019-10-10 21:26:36
【问题描述】:
我明白当我调用诸如
之类的函数时a(b(),c());
那么这个行为可能在 = C++17 中是未指定的,从某种意义上说,由编译器决定是评估 b 还是 @987654324先@@。
我想知道强制评估订单的最佳方式。我将编译为 C++14。
马上想到的是这样的:
#include <iostream>
int count = 5;
auto increment(){
return count++;
}
template <typename A, typename B>
auto diff(A && a, B && b){
return a - b;
}
int main() {
auto && a = increment();
auto && b = increment();
auto c = diff(a,b);
}
我是否处于未定义的行为领域?或者这就是“应该”强制评估顺序的方式?
【问题讨论】:
-
你认为为什么会有ub?
-
@Peter 即使两个函数使用(读取和/或写入)全局变量,行为也不会未定义,而只是未指定。
-
@Peter Expressions 可以以交错的方式计算,直到 C++14,但即使这样,参数中的每个函数调用也必须作为一个整体执行。 从来没有函数可以交错或并行执行。请参阅Rules section 中的规则 11(以及更下方的序列点规则中的规则 4)。
-
@bremen_matt:diff 没有区别(双关语),它仍然只是未指定,而不是 UB。在这方面,标准版本之间没有区别,这始终是未指定的。
-
@bremen_matt:未定义意味着任何事情都可能发生(标准没有指定应该发生什么)。未指定意味着
b()然后c(),或c()然后b()。其中之一会发生。它没有指定,哪个。