c++访问权限
c++ access_once
我正在尝试在c++11中实现Linux宏ACCESS_ONCE
的等效功能。ACCESS_ONCE(x)
获取x的地址,强制转换为指向与x类型相同的volatile的指针,然后取消引用它。这迫使编译器不优化通过该宏对x的访问(并使访问在此处只发生一次)。
我在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*&'
我做错了什么?
template<typename T>
inline T volatile &access_once(T &t) {
return static_cast<T volatile &>(t);
}
这避免了宏,更简单,因为类型推导和引用删除隐含在模板签名中,并且避免了冗余的地址和尊重运算符(引用类型之间的静态强制转换定义为执行与获取地址、强制转换然后取消引用相同的操作)。它同样具有性能,我不认为它依赖于C++11中的任何东西。
将宏更改为:
#define ACCESS_ONCE(x) (*static_cast<std::remove_reference<decltype(x)>::type volatile *>(&(x)))
取消引用指针会导致引用。宏正在尝试将其强制转换为void *& volatile
,而不是您想要的void * volatile
。不能将volatile限定符应用于引用类型,因此必须使用std::remove_reference将其更改为普通的非引用类型。
相关文章:
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 为什么我在空指针错误(链表)中获取成员访问权限
- 为什么"delete"操作员给我访问权限冲突
- 从根权限进程创建可访问的文件
- 父级的子属性 - 访问权限
- 从C++获得对在python中创建的C++类的访问权限
- 威纳派读取自定义文件或文件夹的所有访问权限
- 授予另一个类对特定方法的访问权限
- 链接 boost 库时"Error while loading shared libraries"引发的,除了我无法使用 root 访问权限来修复它
- 正确的友元定义,以授予 std::map 对私有默认构造函数的访问权限
- TOCTTOU - 在处理文件之前使用访问权限
- 如何通过指针仅向结构的某些成员提供可变访问权限
- main() 对连续运行的线程中的编辑值具有只读访问权限 - C++
- 如何使用 c++ 创建对"everyone"具有共享访问权限的文件夹
- 嵌套类嵌套类的访问权限
- 为什么继承的受保护操作员=()有公共访问权限
- Lambda 函数,用于调用有权访问类成员的成员函数
- 根据线程优先级/特权授予对资源的访问权限
- 如何在不需要 root 访问权限的情况下为应用程序中的线程设置相对线程优先级
- 获取从基类指针到具有不同类型的两个派生成员变量的访问权