使用不完整类型实例化类模板:程序是否非法?诊断问题解析
问题分析:该C++程序的格式错误与Clang诊断问题
1. 原程序是否为格式错误程序?
是,原程序属于格式错误的C++代码。
原因:
当实例化模板A<void>时,类成员a的初始化表达式sizeof(T)等价于sizeof(void)。根据C标准,sizeof运算符的操作数不能是void类型——void是无类型,没有可度量的大小,对其使用sizeof属于明确的非法操作,违反了C标准规则。
2. Clang诊断信息存在的问题
Clang处理该代码时,未针对sizeof(void)的非法使用给出任何诊断(报错或警告),反而静默生成了A<void>的显式特化版本,移除了成员a的初始化器。这种行为不符合编译器的诊断要求:对于明确违反标准的代码,编译器应当主动指出错误,而非通过生成特化掩盖问题,会导致开发者无法及时发现代码中的合规性缺陷。
原代码
template <typename T> struct A { int a{sizeof(T)}; }; int main() { sizeof(A<void>); }
Clang生成的特化版本(编译命令:clang++ -std=c++20 -Xclang -ast-print -fsyntax-only main.cpp)
template <typename T> struct A { int a {sizeof(T)}; }; template<> struct A<void> { int a; }; int main() { sizeof(A<void>); }
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

