OpenMP原子在引用类型上?

Gug*_*ugi 5 c++ atomic openmp reference-type

OpenMP标准(<= 4.0)说atomic:

#pragma omp atomic [read | write | update | capture ] new-line
expression-stmt

where expression-stmt是具有以下形式之一的表达式语句:
...
If子句是更新还是不存在:
x++;
...
在前面的表达式中:
xv(如果适用)都是具有标量类型的l值表达式.
...

因此,当我正确解释这一点时,以下短代码片段是非法的:

int main()
{
  int myCounter = 0;
  int& reference = myCounter;

  #pragma omp parallel for
  for (int i = 0; i < 100; ++i)
  {
    #pragma omp atomic
    reference++; // Increment through reference.
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

原因:根据这篇文章,引用(这里int& reference)不是标量类型.但是标准明确规定它必须是一个,才能使用atomic.

代码用g ++编译,没有任何警告(-Wall -Wextra).

我的问题是:我是否误解了C++的"参考类型"的标准或概念?或者大多数编译器都会编译这段代码,因为否则使用atomic会受到严重限制(基本上堆上没有数据可能是目标atomic,因为你总是需要一个引用或一个解引用的指针)?

Cas*_*sey 5

引用类型不是标量类型.但是,这个事实与你的问题无关.一个重要的事实是,计算结果为标量类型的引用的表达式与标量类型的左值.具体而言,变量 reference具有类型,int&表达式 reference具有类型int和值类别lvalue.所以,是的,您的计划符合要求.