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

时间:2015-11-19 16:33:18

标签: c++ object constructor initialization const

在你开始将其标记为重复之前我已经阅读this但我的问题是关于MSVS编译器。链接的问题讨论了g ++编译器。

我在2015年11月3日上次更新的MSVS 2015编译器上尝试了此程序here

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

根据default initialization,上述程序在编译时会失败。它说:

  

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

因此,在上述程序的情况下需要诊断。但MSVS没有给出任何正确的诊断。根据C ++标准,MSVS在这里似乎没有得到确认。 MSVS中的这个错误是否也像在g ++中一样?

1 个答案:

答案 0 :(得分:2)

根据标准草案 8.5 / p7.3 Initializers [dcl.init]

  

(7.3) - 否则,不执行初始化

     

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

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

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

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

出于这个原因,该公司提交了一份缺陷报告DR 253。那说:

  

如果隐式默认构造函数初始化所有子对象,则为no   应该要求初始化程序。

GCC遵循DR这就是编译代码的原因,我的猜测是因为VC ++编译代码的原因相同。

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

class Test{ 
  int i;
};

int main() { 
  const Test t;
}

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

  

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