【发布时间】:2019-05-24 11:36:34
【问题描述】:
看看这个简单的函数调用:
f(a(), b());
根据标准,a()和b()的调用顺序是未指定的。 C++17 有一个附加规则,不允许 a() 和 b() 交错。据我所知,在 C++17 之前,没有这样的规则。
现在,看看这个简单的代码:
int v = 0;
int fn() {
int t = v+1;
v = t;
return 0;
}
void foo(int, int) { }
int main() {
foo(fn(), fn());
}
在 C++17 规则下,v 在调用foo 后肯定会有2 的值。但是,这让我想知道,对于 C++17 之前的版本,是否可以保证相同?还是v 最终变成1?如果我们只有v++ 而不是int t = v+1; v = t;,这有什么不同吗?
【问题讨论】:
-
在没有 C++ 版本的情况下调用允许交错的函数。
-
@n.m.:看起来合乎逻辑。但是为什么 eel.is/c++draft/intro.execution#11 在 C++17 中被扩展为“不允许交错”?
-
@n.m.:糟糕,我在这里犯了一个错误,我在 C++17 之前的版本中以某种方式忽略了这一点。
标签: c++ c++11 c++14 language-lawyer c++17