没有用户提供的构造函数的const限定类型的默认初始化
default initialization of const qualified type with no user provided constructor
在开始将其标记为重复之前,我已经读过了,但我的问题是关于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"自动数据生成的默认构造函数生成不可靠的结果
相关文章:
- 尝试了解C++指针和数据类型初始化
- C++ 基元类型初始化与对象初始化
- C++ 2D shared_ptr数组使用抽象多态类型初始化
- 如何根据构造函数参数使用超类类型初始化成员变量?
- 使用没有默认构造函数的类/类型初始化自定义容器
- Visual C 新类型初始化
- 如何创建一个编译时静态类类型,该类型初始化具有特定值的成员容器
- 使用初始化列表的 POD 类型初始化不起作用
- 大括号之间的自定义类型初始化数组
- std::数组类型初始化
- 错误:类型初始化无效
- 基本类型初始化C++
- 使用派生类类型初始化模板类的静态数组
- 部分默认使用内部类型初始化模板模板参数
- 类型初始化使用 OpenSsl.net 异常
- 存储可以使用不同派生类型初始化的基类型成员变量时,请避免使用new
- 向量和基元类型初始化
- 基元类型初始化的构造函数语法和赋值语法之间的差异
- 是否可以从大括号类型初始化中推断出元组的模板参数
- 可从任何序列类型初始化的c++类