如何在构造函数中使用 std::optional?

How do I use std::optional in a constructor?

我把std::optional放在class的构造函数中。但是,当我创建 class 的实例时,省略了可选参数,我得到的错误是 class 不存在这样的构造函数。我想知道如何正确使用 std::optional.

我的 class 'Car' 的构造函数如下所示:

Car::Car(string make, string model, Racer *driver, optional<Racer*> codriver) : m_make(make), m_model(model), m_driver(driver), m_codriver(codriver)
{
}

这是我的主图:

void main()
{
    Racer *r1 = new Racer{ "John Doe", "male", "08/05/1987", "Ford" };
    Racer *r2 = new Racer{ "Jane Doe", "male", "06/09/1990", "Ford" };
    Racer *r3 = new Racer{ "Howard", "male", "18/04/1985", "Dodge" };

    Car c1{ "Ford", "Mustang GT350R", r1, r2 };
    Car c2{ "Dodge", "Challenger SRT Hellcat RedEye", r3 };
}

我希望使用 optional 可以让我在创建 Car 的新实例时不必提供副驾驶。然而,情况似乎并非如此,因为我收到一个错误,指出没有这样的构造函数。

如果你想要一个函数或 ctor 的可选参数,要么写两个不同的参数,要么使用 default-argument(= whatever 直接在可选的 parameter-name 之后)。
这两个选项都与 std::optional.

无关

无论如何,当您使用std::optional<some_pointer_type>时,请注意所有指针都可以为空。或者换句话说,它们都是 std::optional<non_nullable_pointer> 的实例。那么在您的情况下,空指针与没有指针有何不同?

顺便说一句,它是 int main()

对于您想做的事情,似乎在 class 的 public 部分设置默认值应该可行,如下所示(代码取自 this问题):

class foo  
{
private:
    std::string name_;
    unsigned int age_;
public:
    foo() :
    name_(""),           // Set your default values here
    age_(0)
{
}

foo(const std::string& name, const unsigned int age) :
        name_(name),
        age_(age)
    {
        ...
    }
};

您可以为选项设置默认参数:

Car(string make, string model, Racer *driver, optional<Racer*> codriver=std::nullopt) 
   : m_make(make), m_model(model), m_driver(driver), m_codriver(codriver) { }

但正如 Deduplicator 所说,这也可以通过使用指针作为选项类型来完成(null/not-null):

Car(string make, string model, Racer *driver, Racer* codriver=nullptr) 
   : m_make(make), m_model(model), m_driver(driver), m_codriver(codriver) { }