我在http://en.cppreference.com/w/cpp/language/value_initialization中读到了关于值初始化的内容,但我对以下示例代码感到困惑:
struct A {
int i;
A() {} // user-provided ctor, does not initialize i
};
struct B { A a; }; // no user-provided ctor
std::cout << B().a.i << '\n'; // value-initializes a B temporary
// leaves b.a.i uninitialized in C++03
// sets b.a.i to zero in C++11
// (note that B{}.a.i leaves b.a.i uninitialized in C++14, but for
// a different reason: C++14's B{} is aggregate-initialization)
Run Code Online (Sandbox Code Playgroud)
cppreference说:
在所有情况下,如果使用空的大括号{}并且T是聚合类型
that is not a class type with a default constructor (until C++14),则执行聚合初始化而不是值初始化.
我认为B{}应该在C++ 11中进行值初始化,因为B有一个默认的构造函数(因为A).根据关于值初始化的规则:
2)如果T是没有任何用户提供的构造函数的非联合类类型,则该对象被零初始化,然后调用隐式声明的默认构造函数(除非它是微不足道的)
(从C++ 11开始)(直到C++ 14)
所以我认为B {}应首先进行零初始化,然后调用默认构造函数.但不幸的是,我使用clang ++编译代码,-std = c ++ 11,其值B{}.a.i未初始化.有什么问题?