0

我尝试将 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”会丢弃限定符

如何解决?

4

1 回答 1

4

使用就地构造函数。

在 boost 中,这是this 构造函数,它接受一个in_place_init_t变量,然后使用以下参数进行构造。

boost::optional<B> op(boost::in_place_init, a);
// Calls `B::B(A&) with `a`

或者要继续使用in_place默认情况下采用 const 引用的 ,请指定它不是 const 引用:

boost::optional<B> op(boost::in_place<A&>(a));
于 2019-04-02T21:05:27.043 回答