使用未初始化的成员复制结构

复制一个未初始化其成员的结构是否有效?

我怀疑这是未定义的行为,但如果是这样,则会使任何未初始化的成员保留在结构中(即使从未直接使用这些成员)也很危险。所以我想知道标准中是否有允许它的东西。

例如,这有效吗?

struct Data {
  int a, b;
};

int main() {
  Data data;
  data.a = 5;
  Data data2 = data;
}
评论
  • fet
    fet 回复

    通常,复制未初始化的数据是未定义的行为,因为该数据可能处于陷阱状态。对于浮点类型,可能会发信号通知NaN,直到允许C ++ 20整数具有陷阱表示(C ++ 20强制性带符号整数具有二进制补码表示)。

    However, for trivially copyable types it is possible to use memcpy to copy the raw representation of the object. Doing so is safe since values of the object members are not interpreted, and instead the raw byte sequence of the object representation is copied.

  • caut
    caut 回复

    All classes and structures have default constructors, that includes copy constructors with respective copy assigment operator, also, every memeber will be initialized by default as soon as you create the object.

    因此,这是完全合法的,而不是UB所做的。

  • 黑暗的冰
    黑暗的冰 回复

    The compiler will generate the Assignment Operator for you, as can be seen in this answer from a similar question: https://stackoverflow.com/a/1575369/3155810

  • pquis
    pquis 回复

    是的,如果未初始化的成员不是未签名的窄字符类型,则复制包含不确定值的结构在技术上是未定义的行为,因为复制具有相同类型的不确定值的变量是技术上未定义的行为。

    This is also subject of the active CWG issue 2264.

    我想在实践中您不会对此有任何问题。