含const std::vector成员时显式默认的默认构造函数为何被隐式删除?
关于const成员变量与显式默认构造函数的编译器差异问题
先看代码片段:
#include <vector> struct dummy { std::vector<int> const data; dummy() = default; };
问题现象
这段代码在除Clang 9至14版本外的多数编译器中都能正常编译,但Clang 9-14会给出如下警告:
warning: explicitly defaulted default constructor is implicitly deleted [-Wdefaulted-function-deleted]
note: default constructor of 'dummy' is implicitly deleted because field 'data' of const-qualified type 'const std::vector' would not be initialized
Clang 15版本后该警告消失;如果移除data的const修饰符,这个问题也会消失。原本预期const的data会被自动初始化为空的vector,因此疑惑这是不是Clang的Bug,以及为何其他编译器没有报错。
问题分析
这其实是Clang 9-14版本的编译器Bug,原因如下:
- 根据C++标准,当类的非静态成员是
const限定类型时,只要该类型拥有可用的默认构造函数(比如std::vector的默认构造函数合法且可访问),显式默认的类默认构造函数就应该能调用成员的默认构造函数完成初始化,不会被隐式删除。 - Clang 9-14错误判定
const std::vector<int>无法被默认初始化,因此错误标记类的默认构造函数被隐式删除;而其他编译器(如GCC、MSVC)以及Clang 15之后的版本都正确遵循了标准,允许这种初始化行为。 - 移除
const修饰符后,成员变量可被默认初始化(即使无显式初始化语句),因此编译器不会再触发构造函数被删除的警告。
结论
- Clang 9-14的警告属于编译器实现错误,在后续的Clang 15版本中已修复。
- 其他编译器的行为符合C++标准,
const std::vector<int>成员确实可通过其默认构造函数初始化为空容器,因此类的显式默认构造函数是有效的。
内容的提问来源于stack exchange,提问作者Oersted
相关产品推荐
相关产品推荐

