关于类型的移动语义的考虑

Mar*_*tin 5 c++ c++11

我正在实施一种类型T.虽然这不是必需的,但是这种类型的用户可能会受益于移动语义,即T(T&&)T& operator=(T&&).

由于T包含std::function作为成员数据,我无法使用noexcept保证来实现移动语义,这对用户来说T 不那么有用.

另外,由于上述原因,我的实现不能像以下那样简单:T(&&) noexcept = defaultT& operator=(T&&) noexcept = default

替代方案是向用户提供noexcept版本:T(&&) = defaultT& operator=(T&&) = default; 或者实现我的用户定义的noexcept移动语义std::function::swap()(保证是这样noexcept).在后一种情况下,遗憾的是我不得不照顾除了std::function(丑陋!)以外的所有其他成员数据.

所以,有三种选择:

  1. 禁用移动语义
  2. 实施T(&&) = defaultT& operator=(T&&) = default
  3. 实现自己的T(&&) noexcept {/* lot of code */}T& operator=(T&&) noexcept {/* lot of code */}

我知道这个问题相当主观,但你会选择什么?

Use*_*ess 4

假设您确实想要noexcept迁移,您可以通过以下任一方式减少选项 #3 的样板文件数量:

  1. 将 default-noexcept-moveable 成员分组到嵌套结构成员或私有基类中,并编写一个 move-ctor 来简单地移动该成员(一行用于所有这些成员),然后交换 s std::function,或者
  2. 编写一个 SwapMove 模板包装器来存储functionin。它只需要使用 swap 实现 move ctor 和赋值运算符,并默认其他所有内容。好的,您还需要公开function成员或转发函数调用运算符。