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

edA*_*a-y 1 c++ c++17

我想添加一个新的构造现有类,不知道如果我能以某种方式做一个emplace的初始化optional,然后在初始化另一个成员值使用该值.

例如:

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 ) {
    }
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*las 5

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

run( std::in_place, ctor_arg )
Run Code Online (Sandbox Code Playgroud)

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

optional<opt_type> run;
my_type sc;
Run Code Online (Sandbox Code Playgroud)