当一个类成员在构造的那一刻不能有合理的意义时,我不会初始化它。显然,这只适用于 POD 类型,您不能使用构造函数初始化对象。
这样做的好处是,除了节省 CPU 周期,将某些东西初始化为一个没有意义的值之外,我可以使用 valgrind 检测这些变量的错误使用;当我只是给这些变量一些随机值时,这是不可能的。
例如,
struct MathProblem {
bool finished;
double answer;
MathProblem() : finished(false) { }
};
在数学问题解决(完成)之前,没有答案。answer
提前初始化(到零)是没有意义的,因为这可能不是答案。只有在设置为 trueanswer
之后才有意义。finished
因此,在初始化之前使用answer
是一个错误,并且完全可以成为 UB。
但是,初始化之前的一个简单副本answer
当前也是 UB(如果我正确理解标准),这没有意义:默认的复制和移动构造函数应该能够简单地制作一个简单的副本(又名,如-如果使用memcpy),是否已初始化:我可能想将此对象移动到容器中:
v.push_back(MathProblem());
然后使用容器内的副本。
移动具有未初始化的、可简单复制的成员的对象是否确实被标准定义为 UB?如果是这样,为什么?这似乎没有意义。