struct B
{
B() : member{}{};
int member[10];
};
int main()
{
B b;
}
VS2013编译器的代码给出以下警告:
警告C4351:新的行为:数组 'B ::构件' 的元件将 缺省初始化1> test.vcxproj - > C:\用户\ asaxena2 \文件\视觉工作室 2013 \项目\测试\调试\ TEST.EXE
这是记录的here
使用C++ 11,并应用“默认初始化”的概念,意味着B.member的元素将不会被初始化。
但我相信member{}
应该执行值初始化,而不是默认初始化。 VS2013编译器是否损坏?
$ 7.0/6
为默认初始化
T
类型的对象是指: - 如果T
是一个(可能CV修饰)类型(第9节),用于T
默认构造函数被调用(如果T
没有可访问的默认构造函数,则初始化不合格);
- 如果T
是一个数组类型,则每个元素都默认初始化;
- 否则,不执行初始化。
如果程序要求const
限定类型T
的对象的默认初始化,则T
应为具有用户提供的默认构造函数的类类型。
$ 8.5.1
对象或
T
类型的参考的列表的初始化被定义如下:
- 如果初始化列表没有任何元素和T
是一个类类型具有默认构造函数,该对象进行了值初始化。
- 否则,如果T
是一个聚合,则执行聚合初始化(8.5.1)。如果列表中的初始化子句少于聚合中的成员,则未初始化的每个成员都应从空初始化列表(8.5.4)初始化。 [实施例:
初始化
ss.a
与1
,ss.b
与"asdf"
,和ss.c
与表单int()
的表达式的值,即,0
。末端例如]
这是一个很好的问题,但“Visual Studio编译器行为”是一个可怕的标题。考虑将其改为更有意义的东西。也就是说,你是否验证过编译器的行为?这可能只是一个误导性的警告。 – hvd
@ hvd:改变了它。谢谢 – user3701522