代码之家  ›  专栏  ›  技术社区  ›  curiousguy

当不是所有的成员都初始化时,普通类型类是否可以被复制?

  •  0
  • curiousguy  · 技术社区  · 5 年前

    (我刚刚意识到,我首先需要解决一个更基本的问题,那就是复制工会: When a union object is copied, is a member subobject created? . 请先看另一个问题。)

    因此,不能复制某些成员未初始化的类,因为访问未初始化的对象是非法的。

    struct C {
      int m1, m2;
    };
    
    void f() {
      C c1, c2;
    
      c1.m1 = 1;
      c2 = c1; // not initialized
    }
    

    但是联合总是可以被复制的,即使它包含类成员,其中一些还没有初始化(因为。。。根据定义,联合中没有两个成员被初始化)。

    这是否意味着复制具有未初始化成员的类的联合是合法的:

    union U {
      C m;
    };
    
    void g() {
      U u1, u2;
      u1.m.m1 = 1;
      u2 = u1;
    }
    

    如果是这样,类是否可以通过强制转换复制到这样的联合体中?

    void f2() {
      C c1, c2;
    
      c1.m1 = 1;
      (U&)c2 = (U&)c1; // not initialized?
    }
    
    0 回复  |  直到 5 年前
        1
  •  2
  •   Davis Herring    5 年前

    std::memcpy . 如果默认操作符没有建立正确的活动成员,并且 标准::内存 也应该这样做。)

    但是,不能使用cast to union作为普通类对象的安全副本;对赋值运算符的调用具有未定义的行为 special rule 需要,因为它不涉及对任何(标量)对象的访问。你自己的 标准::内存 -即使是通过 reinterpret_cast unsigned char (也许 char )以及 std::byte always allowed