在可选结构成员中赋值成员

Assigning member in optional structure memeber

本文关键字:成员 赋值 结构      更新时间:2023-10-16

为结构体的可选成员赋值的最佳样式是什么?例如,我有一个结构体:

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。我告诉你,这里有一个emplace()方法可以为你做同样的事情:a.b.emplace()