11

boost::optional< T >如果基础类型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进度会被冻结?”。

4

1 回答 1

17

boost::optional可以通过使用就地工厂以不可复制的类型初始化。

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

#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 中实现。

于 2013-05-26T20:37:48.607 回答