【发布时间】:2021-06-17 12:38:00
【问题描述】:
当一个类成员在构造的那一刻不能有有意义的意义时, 我不初始化它。显然,这只适用于 POD 类型,你不能 NOT 用构造函数初始化一个对象。
这样做的好处是,除了节省 CPU 周期来初始化某些东西 一个没有意义的值是我可以检测到这些的错误使用 带有 valgrind 的变量;当我只给出这些变量时这是不可能的 一些随机值。
例如,
struct MathProblem {
bool finished;
double answer;
MathProblem() : finished(false) { }
};
在数学问题解决(完成)之前,没有答案。提前初始化answer(到零)是没有意义的,因为这可能不是答案。 answer 仅在 finished 设置为 true 后才有意义。
因此,在初始化之前使用answer 是一个错误,并且完全可以成为 UB。
但是,answer 在初始化之前的一个简单副本当前也是 UB(如果我正确理解标准的话),这没有意义:默认的复制和移动构造函数应该能够简单地创建一个微不足道的副本(又名,好像使用 memcpy),是否已初始化:我可能想将此对象移动到容器中:
v.push_back(MathProblem());
然后使用容器内的副本。
移动一个具有未初始化的、可简单复制的成员的对象是否确实被标准定义为 UB?如果是这样,为什么?这似乎没有意义。
【问题讨论】:
-
在 C 中,复制这种未初始化的 POD 可能会导致“不确定的值:未指定的值或陷阱表示”。它陷阱表示刺痛。
-
@chux-ReinstateMonica
int在表示陷阱表示时有什么值? -
bool finished; int answer;那是std::optional就在这里。 -
当
int有陷阱值时,它没有数值。 “陷阱表示:不需要表示对象类型的值的对象表示。”如今,int的陷阱值很少见。今天更常见的是指针,但总体上并不常见。 -
@DavisHerring:无条件复制
answer的复制构造函数可能比在finished为假时竭尽全力避免复制它的构造函数更快。
标签: c++ language-lawyer standards undefined-behavior trivially-copyable