boost::可选 - 对对象使用 boost::in_place,构造器通过引用获取其他对象

boost::optional - using boost::in_place for the object which constuctor takes other object by the reference

本文关键字:boost 对象 构造器 引用 其他 获取 in 可选 place      更新时间:2023-10-16

我尝试对不可移动和不可复制的对象使用 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 中,这就是这个构造函数,它接受一个 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));