在可选结构memeber中分配成员

时间:2015-07-20 09:48:18

标签: c++ boost-optional

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

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 个答案:

答案 0 :(得分:5)

除了在使用之前初始化它别无选择。如果你不这样做,你将会有一个断言失败,导致终止。

但是如果你问的是如何初始化它,那么它们就有很多:

  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()