MSVC支持但是Clang会报错的C++举动

[复制链接]
发表于 2025-7-9 03:46:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目标

由于在使用clang进行ast分析msvc项目标时候,出现了爆红征象,了解到msvc会有一些不严格按照c++标准但是允许的语法,在这点上clang就很严格,所以本文以clang为基准,记录到目前为止发现的msvc的非标语法。
友元别名

  1. class A{};
  2. class B
  3. {
  4.         using AOtherName = A;
  5.         friend class AOtherName; // msvc允许,clang报错【别名不能和class/struct一起用】
  6.         friend AOtherName; // 正确做法
  7. };
复制代码
由于在 C++ 中,范例别名(通过 typedef 或 using 定义)不能与 class 或 struct 等修饰符一起使用。stack对此的回答
模板类显式特例化的定名空间限制

  1. template<typename T>
  2. struct AStruct
  3. {
  4.         static bool isZero(const T& val);
  5. };
  6. namespace A
  7. {
  8. // msvc不报错,clang报错【模板特例化必须跟原始模板在同一命名空间】
  9. template<>
  10. struct AStruct<int>
  11. {
  12.         static bool isZeros(const int& val)
  13.         {
  14.                 return val == 0;
  15.         }
  16. };
  17. }
  18. // 正确做法,同样定义在全局命名空间
  19. template<>
  20. struct AStruct<int>
  21. {
  22.         static bool isZeros(const int& val)
  23.         {
  24.                 return val == 0;
  25.         }
  26. };
复制代码
在C++中模板类的显式特化必须在其原始模板定义地点的定名空间中进行!stack对此的回答
   但是在msvc编译器中,如果原始模板在全局定名空间中定义,msvc允许特例化在其他的定名空间,而结果等同于在全局定名空间中定义。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5

GMT+8, 2025-7-25 07:46 , Processed in 0.076851 second(s), 30 queries 手机版|qidao123.com技术社区-IT企服评测▪应用市场 ( 浙ICP备20004199 )|网站地图

快速回复 返回顶部 返回列表