如何使用const值优雅地赋予可选项

abe*_*ier 0 c++ optional c++17

我试图使用a std::optional来实例化一个对象(之前无效).我发现了一个烦人的情况,我不知道如何优雅地解决这个问题.

我有以下数据结构:

struct Foo {
    int foo1;
    float foo2;
};
Run Code Online (Sandbox Code Playgroud)

作为会员std::optional<Foo> foo_.

在一个功能

void Bar::bar(int const value1, float const value2) {
    foo_.emplace(value1, value2);
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,这无法编译(在GCC 7.1中),因为它试图调用Foowith 的构造函数int const&, float const&.现在天真的我试图专注emplace于:

foo_.emplace<int, float>(value1, value2);
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它试图使用initializer_list那么.

所以我的问题是如何优雅地召唤出来?

Jar*_*d42 6

您必须添加构造函数作为emplace使用()构造函数而不是{}(这将允许聚合初始化).

struct Foo {
     Foo(int i, float f) : foo1(i), foo2(f) {}

    int foo1;
    float foo2;
};
Run Code Online (Sandbox Code Playgroud)

或者明确使用的构造函数:

foo_.emplace(Foo{value1, value2});
Run Code Online (Sandbox Code Playgroud)