boost::optional - 对构造函数通过引用获取另一个对象的对象使用 boost::in_place
boost::optional - using boost::in_place for the object which constuctor takes other object by the reference
我尝试将boost::in_place用于构造函数通过引用获取其他对象的不可移动和不可复制的对象:
struct A
{
};
struct B
{
B(A& a): a_(a){}
B(B const &) = delete;
B(B&&) = delete;
B& operator=(B const &) = delete;
B& operator=(B&) = delete;
A& a_;
};
int main()
{
A a;
boost::optional<B> op(boost::in_place(a));
return 0;
}
代码无法编译:将“A&”类型的引用绑定到“const A”会丢弃限定符
如何解决?
使用就地构造函数。
在 boost 中,这是 this constructor,它采用 in_place_init_t
变量,然后使用以下参数构建。
boost::optional<B> op(boost::in_place_init, a);
// Calls `B::B(A&) with `a`
或者要继续使用默认采用常量引用的 in_place
,请指定它不是常量引用:
boost::optional<B> op(boost::in_place<A&>(a));
我尝试将boost::in_place用于构造函数通过引用获取其他对象的不可移动和不可复制的对象:
struct A
{
};
struct B
{
B(A& a): a_(a){}
B(B const &) = delete;
B(B&&) = delete;
B& operator=(B const &) = delete;
B& operator=(B&) = delete;
A& a_;
};
int main()
{
A a;
boost::optional<B> op(boost::in_place(a));
return 0;
}
代码无法编译:将“A&”类型的引用绑定到“const A”会丢弃限定符
如何解决?
使用就地构造函数。
在 boost 中,这是 this constructor,它采用 in_place_init_t
变量,然后使用以下参数构建。
boost::optional<B> op(boost::in_place_init, a);
// Calls `B::B(A&) with `a`
或者要继续使用默认采用常量引用的 in_place
,请指定它不是常量引用:
boost::optional<B> op(boost::in_place<A&>(a));