请考虑以下代码:
template <class T>
struct myclass
{
// Select only one constructor in the following
myclass() = default; // 0
myclass() {}; // 1
myclass(): i{}, ptr{}, var{}, arr{}, vec{}, str{} {} // 2
myclass(): i(), ptr(), var(), arr(), vec(), str() {} // 3
// Data members
int i;
T* ptr;
T var;
std::array<int, 3> arr;
std::vector<T> vec;
std::string str;
};
及其用途:
myclass<std::array<double, 3>> a;
myclass<std::array<double, 3>> b{};
myclass<std::array<double, 3>> c();
auto d = myclass<std::array<double, 3>>{};
auto e = myclass<std::array<double, 3>>();
总而言之,选择混合构造函数/构造方法,我们有4 * 5 = 20个案例:a0, a1, a2, a3, b0, b1, b2, b3, ..., e3
。我的问题是:
导致初始化成员的情况(i
设置为零,ptr
设置为nullptr
,arr
填充零)以及哪些情况导致未初始化成员?
答案 0 :(得分:4)
首先,c
是函数声明(vexing parse)
对于2,3,内置的值初始化将进行零初始化
2,3将调用std::string
的默认构造函数,std::vector
(如此为空)
2将初始化值std::array
(其元素值已初始化)
3将聚合初始化std::array
这是一个聚合(其元素的值初始化,0
为int
,double
)。
对于0,1,内置的默认初始化不会初始化它们
0,1将调用std::string
的默认构造函数,std::vector
(如此为空)
默认初始化std::array
将默认初始化其元素(int
和double
未初始化)
对于myClass
,对于1,2,3:
对于myClass
,对于0:
值初始化执行零初始化,然后默认初始化。
所以成员将被初始化为2,3,b-0,d-0,e-0