未实例化的非法模板特化可命名吗?C++代码合规性判定
未实例化的格式错误模板特化命名是否合规?
先看这段代码:
template <typename T, int N> struct array { T data[N]; }; using bad_array = array<void, 0>;
这段代码是合规有效的,不属于“格式错误无需诊断”的范畴。
原因很直接:C++标准中,给模板特化起别名的操作只是对该特化的引用,并不会触发模板的实例化过程。只有当你实际使用这个别名创建对象、访问它的成员(比如bad_array::data),或是以其他方式触发实例化时,才会生成具体的类定义,这时void data[0]的问题才会导致程序格式错误。
只要不触发实例化,仅仅给这个潜在有问题的特化命名,完全符合标准要求,编译器也不需要对此报错。
内容的提问来源于stack exchange,提问作者Jan Schultke
相关产品推荐
相关产品推荐

