c++ - 奇怪的解析行为 _Atomic 与模板
问题描述
//clang 3.8.0
#include <iostream>
template<typename T>
_Atomic T* get_atomic(T* val) {
return reinterpret_cast<_Atomic T*>(val);
}
int main()
{
volatile int val = 1;
_Atomic volatile int* val_ptr = reinterpret_cast<_Atomic volatile int*>(&val);
// works as expected
std::cout << *val_ptr;
// Fails due to "_Atomic cannot be applied to qualified type 'volatile int'"
//std::cout << "Hello, world!\n" << *get_atomic(&val);
}
为什么解析模板扩展的方式和解析显式扩展的方式有差异?它们应该是相同的。有没有办法确保 _Atomic 在存在模板参数的情况下被视为限定符?
解决方案
该关键字_Atomic
来自 C (C11),而不是 C++ 中的关键字。在 C++ 中,原子是通过std::atomic
. 最好不要混合两种语言的句法概念。
如果您必须混合使用两种语言访问原子数据的代码,您应该处理原子类型,例如std::atomic_int
,或发明一些类似于以下的宏接口
#ifdef __cplusplus
#define myAtomic(T) std::atomic< T >
#else
#define myAtomic(T) _Atomic(T)
#endif
在任何合理的平台上,这些都应该是二进制兼容的。
推荐阅读
- javascript - React Native,更改按钮颜色并呈现不同的文本
- r - 在 R 中第一次出现连字符或下划线之前删除字符串中的单词
- python-3.x - 无法使用 Python 从 Selenium WebDriver 中的 Bootstrap 下拉菜单中单击元素
- maven - maven 无法将 jar 文件传输到 nexus 存储库
- git - 重复/镜像 git 存储库:无效的 refspec
- sdn - OpenDaylight 铝集群设置问题
- bash - 通过更改顺序重命名由特殊字符分隔的多个文件
- python-requests - 如何使用电报机器人 API 发送文档?
- python - 如何使用无维度张量流重塑张量
- wso2 - 错误:无法从 APIM Admin API 检索自定义 url 信息 - WSO2 API Manager Analytics