C++默认构造函数何时会被隐式删除?是否存在实现依赖的灰色区域?
核心结论
不存在编译器实现相关的灰色地带,C++标准对默认构造函数的隐式声明规则有明确的强制要求,所有符合标准的编译器行为完全一致。
默认构造函数保证不存在的判定规则
- 只要你为类声明了任意一个用户自定义构造函数(不管是带参普通构造、拷贝构造、移动构造,或是指定了explicit的构造函数),编译器就绝对不会隐式生成默认构造函数,此时你没有手动声明默认构造函数的前提下,类的默认构造函数保证不存在。
- 你给出的示例代码中的
Foo类已经显式声明了带int参数的构造函数,因此Foo()默认构造函数不可能被隐式声明,直接调用Foo f;初始化对象会在所有符合标准的编译器上报错。
官方标准依据
类X的默认构造函数是指每个非函数参数包的参数都有默认实参的X类构造函数(包括无参构造函数的情况)。如果类X没有用户声明的构造函数,一个无参的非explicit构造函数会被隐式声明为defaulted(11.4节)。隐式声明的默认构造函数是该类的inline public成员。
标准此处的表述是单向充分必要条件:只有满足「无用户声明构造函数」这个前提时,才会触发隐式默认构造函数的生成逻辑。反过来只要不满足这个前提,就不会触发隐式生成,没有任何例外情况。
两种容易混淆的特殊情况说明
- 如果你手动写了
Foo() = default;,属于你显式要求编译器生成默认构造函数,不属于隐式生成范畴,这种情况默认构造函数存在是用户主动声明的结果。 - 如果你声明的带参构造函数所有参数都自带默认值,比如
Foo(int i = 0);,这个构造函数本身就属于用户声明的默认构造函数,也不属于编译器隐式生成的情况。
代码验证示例
class Foo { public: Foo( int i ); }; // 以下代码必然编译失败,提示找不到匹配的默认构造函数 Foo f;
内容的提问来源于stack exchange,提问作者AlpinistKitten
相关产品推荐
相关产品推荐

