OpenMP标准(< = 4.0)说atomic
:
#pragma omp atomic [read | write | update | capture ] new-line
expression-stmt
其中
expression-stmt
是一个带有其中一个的表达式语句 以下表格:
...
如果条款更新或不存在:
x++;
...
在前面的表达式中:
x
和v
(如果适用)都是带有标量类型的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;
}
原因:根据this post,引用(此处int& reference
)不是标量类型。但是标准明确指出它必须是一个,才能使用atomic
。
代码用g ++编译,没有任何警告(-Wall -Wextra
)。
我的问题是:我是否误解了标准或C ++&#34;参考类型&#34;的概念?或者大多数编译器都会编译此代码,因为否则atomic
的使用受到严重限制(基本上堆上的数据可能不是atomic
的目标,因为您总是需要引用或解除引用的指针) ?
答案 0 :(得分:5)
引用类型不是标量类型。但是,这个事实与你的问题无关。重要的事实是,计算对标量类型的引用的表达式是具有标量类型的左值。具体而言,变量 reference
的类型为int&
,但表达式 reference
的类型为int
和值类别左值。所以,是的,你的程序符合要求。