boost :: optional-使用boost :: in_place作为对象,该对象通过引用将其他对象作为对象

时间:2019-04-02 20:56:56

标签: c++ c++11 boost boost-optional

我尝试将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&”的引用绑定到“常量A”会丢弃限定符

该如何解决?

1 个答案:

答案 0 :(得分:3)

使用就位构造函数。

在增强中,这是this constructor,它接受​​一个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));