考慮以下代碼,其中x
和y
是整數:此編譯器轉換是否允許?
if (x)
y = 42;
是以下編譯器允許轉型?
int tmp = y;
y = 42;
if (!x)
y = tmp;
背景:
這是Bjarne的Stroustrup的FAQ:
// start with x==0 and y==0
if (x) y = 1; // Thread 1
if (y) x = 1; // Thread 2
的FAQ狀態,這是數據的比賽免費;與x
和y
都是0,沒有瓦爾應寫入。
但如果轉變是允許什麼?
是(但不能真正使用的名字'tmp'當然)。但你爲什麼在意? –
@BaummitAugen真的嗎?如果'y'可以從其他線程訪問,那麼轉換可能會引入數據競爭。 – hvd
@ hvd沒有其他線程可以改變'x'或訪問'y';那已經是UB了。明確表示:要麼沒有新的種族,要麼破譯代碼。 (除非'x'是'std :: atomic',但Q不這麼說。) –