我可以将optional :: emplace称为成员初始化程序吗?

时间:2017-07-08 18:14:25

标签: c++ c++17

我正在尝试添加一个现有类的新构造函数,并想知道我是否可以某种方式对emplace执行optional初始化,然后在初始化程序中将该值用于另一个成员值。< / p>

例如:

class sample {
    my_type sc;
    optional<opt_type> run;

    sample() :
        sc( gen_default() ) {
    }

    enum ctor_alt { ctor_alt };
    sample( ctor_alt ) :
        emplace( run, ctor_arg ), /* Possible somehow? */
        sc( run.field ) {
    }

我的主要动机是我不想改变my_type的类型。这个变量有很多用户,并将它放在一个包装器中需要更改很多代码。

2 个答案:

答案 0 :(得分:5)

emplace是一个成员函数,在构造对象之前不能执行成员函数(除非你是对象的构造函数)。但是如果你想在原地构建一个参与optional<T>,你可以简单地使用std::in_place构造函数:

run( std::in_place, ctor_arg )

但是,成员初始化程序总是按成员声明的顺序执行,而不是成员初始化程序列表中的顺序(如果您不按顺序初始化它们,编译器应该发出警告) 。因此,如果您想使用较早的初始化程序来初始化以后的变量,则必须在声明中正确排序它们:

optional<opt_type> run;
my_type sc;

答案 1 :(得分:3)

当然,只需使用std::in_place_t调用constructor of std::optional

run{std::in_place, ctor_arg}

std::in_place_t是一种标记类型,当您希望类型在适当位置构造值而不是复制它时,可以消除歧义。

如果要对另一个成员变量使用optional的值,则需要确保该成员变量在可选后,因为成员对象按它们出现的顺序初始化