在你开始将其标记为重复之前我已经阅读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 ++中一样?
答案 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'自动数据 生成的默认构造函数会产生不可靠的结果