使用 C++11 引入了统一初始化,我的印象{}
是现在对于所有情况(如果允许)都是非常安全的初始化。但我刚刚注意到,我弄错了。
什么是所有类型的安全初始化形式?带有已删除/私人默认 c'tor 或课程的霸菱课程。
某些类型的详细信息
这是一个内置的:
int u; // evil, x will be un-initialized
int v{}; // nice value-initialization, as far as I know.
int w={}; // nice value-initialization, right?
int x={0}; // proper initialization, not suited for other types though
int x=0; // proper initialization, also not suited
但是像这样的聚合tm
#include <ctime>
tm birth1{}; // evil. nothing initialized.
tm birth4=tm(); // yes! nice value-initialization.
tm birth2 ={}; // evil. nothing initialized
tm birth3 ={0}; // evil, only first member init
但使用C 数组
int data1[9] ={}; // evil. nothing initialized.
int data1[9] ={0}; // proper (value?)-initialization of all elements
使用编译器生成的 default-c'tor 聚合之外的类又如何呢?
struct Widget {
std::string name;
int val;
};
Widget w1; // w1.val will be uninitialized
Widget w2{}; // w2.val will be uninitialized
Widget w3 = Widget{}; // ??? will w3.val be value-initialized?
Widget w4{0}; // an error, or course.
我忘记了一个重要的种类吗?
适合所有人的模板?
作为一个扩展的问题,我想知道是否有一种适当的/好的/任何方式来编写一个模板函数,该函数为可以以这种方式初始化的所有类型返回一个正确初始化的对象:
template<typename T>
T init() {
return T{};
// or 'T t = T{}; return t;'
// or...
}