我正在尝试添加一个现有类的新构造函数,并想知道我是否可以某种方式对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
的类型。这个变量有很多用户,并将它放在一个包装器中需要更改很多代码。
答案 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的值,则需要确保该成员变量在可选后,因为成员对象按它们出现的顺序初始化