【发布时间】:2014-06-09 14:05:31
【问题描述】:
考虑下面的代码
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
这是记录在here
在 C++11 中,应用“默认初始化”的概念,意味着 B.member 的元素不会被初始化。
但我相信member{} 应该执行值初始化而不是默认初始化。 VS2013编译器坏了吗?
$8.5/6
默认初始化
T类型的对象意味着: — 如果T是(可能是 cv 限定的)类类型(第 9 条),则调用T的默认构造函数(如果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" };用
1初始化ss.a,用"asdf"初始化ss.b,用int()形式的表达式的值初始化ss.c,即0。 ——结束示例]
【问题讨论】:
-
这是一个很好的问题,但是“Visual Studio 编译器行为”是一个可怕的标题。考虑将其更改为更有意义的内容。也就是说,您是否验证了编译器的行为?这很可能只是一个误导性警告。
-
@hvd:改变了它。谢谢
标签: c++ c++11 visual-studio-2013 constructor value-initialization