我想在C++ 11中實現等效的Linux宏ACCESS_ONCE
。 ACCESS_ONCE(x)
將x的地址轉換爲指向與x相同類型的volatile的指針,然後對其進行解引用。這迫使編譯器不通過這個宏來優化對x的訪問(並且在這裏只發生一次訪問)。C++ access_once
我試圖做到這一點在C++ 11涉及decltype
:
#define ACCESS_ONCE(x) (*static_cast<decltype(x) volatile *>(&(x)))
這適用於大多數情況下,我卻用它曾經像這樣:
void foo(void **bar) {
while (ACCESS_ONCE(*bar) != NULL)
;
}
這失敗的錯誤:
'volatile' qualifiers cannot be applied to 'void*&'
我在做什麼錯?
這裏正確的轉換是'const_cast',儘管它的名字可以添加和刪除'volatile'限定符以及'const'限定符。 –
@PeteBecker我不同意。 'static_cast'在這裏是正確的選擇。 'const_cast'比必要的更強大。允許'static_cast'添加cv-qualifiers,因爲這個轉換總是安全的。 'const_cast'應該保留用於實際需要不安全轉換的情況,以便刪除* cv-qualifier。 –
@DirkHolsopple - 'static_cast'比必要的更強大,因爲它允許更改類型。 –