【问题标题】:default initialization of const qualified type with no user provided constructor没有用户提供构造函数的 const 限定类型的默认初始化
【发布时间】:2015-11-19 16:33:18
【问题描述】:

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

我在 MSVS 2015 编译器上试用了这个程序,该程序最后更新于 2015 年 11 月 3 日here

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

根据default initialization,上面的程序应该编译失败。它说:

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

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

【问题讨论】:

  • 我想我记得读过一些人认为这是标准中的一个缺陷,即使标准当前说它不是,代码也应该是有效的。如果我能找到参考资料,我会把它作为答案。
  • @hvd:等待您的宝贵答复。
  • 这就是 @101010 现在已经找到的 DR 253。我不会发布重复的答案。 :)

标签: c++ object constructor initialization constants


【解决方案1】:

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

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

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

所以你是对的,const-qualified 对象必须有一个用户提供的构造函数才能被初始化。

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

但是,在您的示例中,class Test 没有成员变量。严格来说,按照标准是不正确的,但是Test没有成员变量,所以没有什么坏处。

因此,委员会提交了缺陷报告DR 253。那就是:

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

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

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

class Test{ 
  int i;
};

int main() { 
  const Test t;
}

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

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

【讨论】:

  • 如果您提交错误会更好。我不知道在哪里提交这个 MSVS 错误?
  • @PravasiMeet 我修改了我的答案不是错误,有 DR。
猜你喜欢
  • 1970-01-01
  • 2018-04-23
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
相关资源
最近更新 更多