ACCESS_ONCE
Linuxマクロに相当するものをc++11
に実装しようとしています。ACCESS_ONCE(x)
xのアドレスを取得し、xと同じタイプの揮発性オブジェクトへのポインターにキャストしてから、それを逆参照します。これにより、コンパイラはこのマクロを介したxへのアクセスを最適化しないように強制されます(そして、アクセスがここで1回だけ発生するようにします)。
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*&'
私は何が間違っているのですか?