没有用户提供的构造函数的const限定类型的默认初始化

default initialization of const qualified type with no user provided constructor

本文关键字:类型 初始化 默认 const 构造函数 用户      更新时间:2023-10-16

在开始将其标记为重复之前,我已经读过了,但我的问题是关于MSVS编译器。相关问题涉及g++编译器。

我在MSVS 2015编译器上尝试了这个程序,它最后一次更新是在2015年11月3日这里

class Test
{ };
int main()
{ const Test t; }

根据默认初始化,上述程序应在编译中失败。上面写着:

如果T是const限定类型,则它必须是具有用户提供的默认构造函数。

因此,在上述程序的情况下,需要进行诊断。但MSVS并没有给出任何正确的诊断。根据C++标准,MSVS在这里似乎没有得到证实。MSVS中的这个bug和g++中的一样吗?

根据标准草案8.5/p7.3初始化器[dcl.init]:

(7.3)——否则,不进行初始化

如果程序调用的对象的默认初始化const限定类型T,T应为用户提供的类类型默认构造函数。

所以您是对的,一个const限定的对象必须有一个要初始化的用户提供的构造函数。

这是因为const限定的对象初始化一次,若并没有提供默认的构造函数,那个么该对象将包含未初始化的值。

但是,在您的示例中,class Test没有成员变量。严格来说,根据标准是不正规的,但由于Test没有成员变量,所以没有害处。

为此,委员会提交了缺陷报告DR 253。上面写着:

如果隐式默认构造函数初始化所有子对象,则不初始值设定项应该是必需的。

GCC遵循DR,这就是它编译代码的原因,我猜也是出于同样的原因,VC++也编译代码。

但是,如果您尝试编译以下代码:

class Test{ 
  int i;
};
int main() { 
  const Test t;
}

GCC将发出错误。VC++2015将发出诊断:

警告C4269:"t":使用编译器初始化的"const"自动数据生成的默认构造函数生成不可靠的结果