关于std::vector中不完全类型的困惑(或Clang bug?)
C++20中std::vector与不完全类型的使用疑问
标准规定
C++20标准在[vector.overview]/4中明确:若分配器满足分配器完整性要求,实例化std::vector时允许使用不完全类型T;但在引用该vector特化的任何成员之前,T必须完成类型定义。默认分配器std::allocator满足该完整性要求。这里的核心疑问是:“引用”的具体定义是什么?
测试代码与编译器表现
测试用例1:仅声明vector成员
#include <vector> class MyClass; class MyContainer { std::vector<MyClass> member; }; class MyClass {}; int main() {}
所有主流编译器均可正常编译通过。
测试用例2:显式默认构造函数
#include <vector> class MyClass; class MyContainer { MyContainer() = default; std::vector<MyClass> member; }; class MyClass {}; int main() {}
仍可被所有主流编译器正常编译。
测试用例3:自定义空默认构造函数
#include <vector> class MyClass; class MyContainer { MyContainer() {}; std::vector<MyClass> member; }; class MyClass {}; int main() {}
编译器表现出现差异:
- GCC 12、Clang 14、C++17模式下的Clang 15:可正常编译
- C++20模式下的Clang 15:编译报错,提示“对不完全类型MyClass的指针进行算术操作”
疑问
直觉上认为Clang 15的C20行为是符合标准的,但其他编译器无警告,且Thrift C编译器会生成此类代码,因此产生以下疑问:
- 这是否属于Clang 15的bug?
- 隐式调用
std::vector<MyClass>的默认构造函数,是否不属于[vector.overview]/4中规定的“引用”范畴?
内容的提问来源于stack exchange,提问作者Lukas Barth
相关产品推荐
相关产品推荐

