C++能保证论点评估的原子性吗?

Does C++ guarantee the atomicity of argument evaluation?

本文关键字:原子性 评估 C++      更新时间:2023-10-16
int a()
{
return 1;
}
int b()
{
return 2;
}
int c()
{
return 3;
}
int g(int, int)
{
return 0;
}
void f(int, int)
{}
int main()
{
f(g(a(), b()),
c());
}

我知道函数参数的求值顺序未按照C++标准指定。

换句话说,实际的评估顺序可能是:

  1. a(), b(), c()
  2. c(), a(), b()
  3. b(), a(), c()
  4. c(), b(), a()

我只是想知道:

C++星达德能保证c()永远不会在a()b()之间被召唤吗?

我想从 C++17 开始保证。N4659(2017年3月科纳工作草案/C++17 DIS([intro.execution]/18,内容如下:

对于每个函数调用F,对于F中发生的每个评估A,以及F内未发生但在同一线程上作为同一信号处理程序的一部分(如果有的话(计算的每个评估B,要么AB之前排序,要么BA之前排序。换句话说,函数执行不会相互交错。

在 C++17 之前,我们没有这样的保证。