0

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

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. 
}

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

4

1 回答 1

5

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

但是,如果您询问初始化它的方法,其中有很多:

  1. a.b = B{10}因为它是 POD 类型的。
  2. a.b = B()正如您已经做过的那样(始终有效,不仅适用于 POD 类型)。
  3. 创建一个构造函数并使其像a.b = B(10). 但是,您始终必须创建一个对象并分配给它。因此,您可以隐式或显式创建对象,但必须这样做。
  4. 正如@nm 所说,在boost 1.56emplace()中,这是一种对您执行相同操作的方法:a.b.emplace().
于 2015-07-20T09:53:53.170 回答