【问题标题】:init boost::optional of non-copyable objectinit boost::optional 不可复制对象
【发布时间】:2013-05-09 12:44:41
【问题描述】:

如果基础类型 T 是非默认可构造、不可复制/可移动,但实例仍然可以存在,我应该如何初始化 boost::optional< T >

由于任何语义原因,boost::optional 是否禁止拥有像template< typename... Args > boost::optional< T >::construct(Args && ...args) 这样的成员函数,它将所有参数传递给就地operator new 以完全构造对象(对于非引用类型T )?变体是具有像std::make_shared< T > 这样的非成员函数。

在我看来,我的问题可以通过使用std::unique_ptr/std::shared_ptr 来解决,但在这种情况下,我的问题是:“为什么boost::optional 进度被冻结?”。

【问题讨论】:

    标签: boost default-constructor noncopyable boost-optional


    【解决方案1】:

    boost::optional 可以使用in-place factories 初始化为不可复制的类型。

    具体来说,你可以像这样使用它们:

    #include <boost/optional.hpp>
    #include <boost/utility/in_place_factory.hpp>
    
    class MyType : private boost::noncopyable
    { 
    public:
      MyType(T1 const& arg1, T2 const& arg2);
    }
    ...
    boost::optional<MyType> m_var;
    ...
    m_var = boost::in_place(arg1, arg2);
    ...
    

    在 C++14 中,有一个提议的 std::make_optional 可以更好地解决这个问题。但是,这还没有在 Boost.Optional 中实现。

    【讨论】:

    • 如果它是默认可构造的呢?有没有办法在没有 boost::in_place 的情况下构造一个不可复制的 boost::optional ?我的各种尝试都编译失败
    • 如果它是默认可构造的 - 不带参数调用 boost::in_place: Foo foo; foo = boost::in_place();
    猜你喜欢
    • 2013-06-01
    • 2018-02-12
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 2018-08-06
    • 2012-06-02
    • 2019-08-24
    • 1970-01-01
    相关资源
    最近更新 更多