【问题标题】:boost::optional - using boost::in_place for the object which constuctor takes other object by the referenceboost::optional - 对构造函数通过引用获取其他对象的对象使用 boost::in_place
【发布时间】:2019-08-24 06:59:58
【问题描述】:

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

如何解决?

【问题讨论】:

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


    【解决方案1】:

    使用就地构造函数。

    在 boost 中,这是 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));
    

    【讨论】:

    • 我必须使用 boost 1.58,我在那里看不到 in_place_init 所以我必须使用你发布的第二个解决方案。
    • @Irbis 添加它可能是为了更符合std::optional 的工作原理。 boost::in_place 的文档相当粗制滥造,但我设法使它与 in_place 工厂一起工作(文档 here)
    猜你喜欢
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    相关资源
    最近更新 更多