在可选结构成员中分配成员

Assigning member in optional structure memeber

分配结构的可选成员的最佳样式是什么? 例如我有一个结构:

struct B{
public:
    int x;
}


struct A{
public:
    boost::optional<B> b;
};


void foo(){
   A a;
   a.b.x = 10; //Runtime exception because a.b is not initialized. 
}

一种选择是定义临时 B 结构并将其分配给 A:

void foo(){
    A a;
    B tmp;
    a.b = tmp;
    a.b.x = 10; //OK. 
}

或:

void foo(){
    A a;
    a.b = B();
    a.b.x = 10; //OK. 
}

有没有更清晰的方法来做到这一点?

您别无选择,只能在使用前对其进行初始化。如果不这样做,您将遇到断言失败,这将导致终止。

但是如果你问的是初始化它的方法,有很多方法:

  1. a.b = B{10} 因为它是 POD 类型。
  2. a.b = B() 就像您已经做的那样(始终有效,不仅适用于 POD 类型)。
  3. 创建一个构造函数并使其像a.b = B(10)。但是,您仍然必须创建一个对象并分配给它。因此,您可以隐式或显式创建对象,但您必须这样做。
  4. boost 1.56 中,正如@n.m 所说,这里有一个 emplace() 方法可以为您做同样的事情:a.b.emplace().