考虑下面的代码
struct B
{
B() : member{}{};
int member[10];
};
int main()
{
B b;
}
VS2013 编译器给出以下警告:
警告 C4351:新行为:数组“B::member”的元素将被默认初始化 1> test.vcxproj -> C:\Users\asaxena2\documents\visual studio 2013\Projects\test\Debug\test.exe
这记录在这里
对于 C++11,并应用“默认初始化”的概念,意味着 B.member 的元素将不会被初始化。
但我认为member{}
应该执行值初始化而不是默认初始化。VS2013编译器坏了吗?
$8.5/6
对类型对象进行默认初始化
T
意味着: — 如果T
是(可能是 cv 限定的)类类型(第 9 条),则调用 的默认构造函数(如果没有可访问的默认构造函数T
,则初始化是非良构的); — 如果是数组类型,则每个元素都是默认初始化的; — 否则,不执行初始化。 如果程序要求对具有-qualified type的对象进行默认初始化,则应是具有用户提供的默认构造函数的类类型。T
T
const
T
T
8.5.1 美元
对象或类型引用的列表初始化
T
定义如下:
— 如果初始化器列表没有元素并且T
是具有默认构造函数的类类型,则对象是值初始化的。
— 否则,如果T
是聚合,则执行聚合初始化(8.5.1)。如果列表中的初始化子句少于聚合中的成员,则每个未显式初始化的成员都应从空的初始化器列表(8.5.4)中初始化。[示例:
struct S { int a; const char* b; int c; }; S ss = { 1, "asdf" };
ss.a
使用、 和形式的表达式的值进行初始化1
,即. —结束示例]ss.b
"asdf"
ss.c
int()
0