我正在实施一种类型T.虽然这不是必需的,但是这种类型的用户可能会受益于移动语义,即T(T&&)和T& operator=(T&&).
由于T包含std::function作为成员数据,我无法使用noexcept保证来实现移动语义,这对用户来说T 不那么有用.
另外,由于上述原因,我的实现不能像以下那样简单:T(&&) noexcept = default和T& operator=(T&&) noexcept = default
替代方案是向用户提供非noexcept版本:T(&&) = default和T& operator=(T&&) = default; 或者实现我的用户定义的noexcept移动语义std::function::swap()(保证是这样noexcept).在后一种情况下,遗憾的是我不得不照顾除了std::function(丑陋!)以外的所有其他成员数据.
所以,有三种选择:
T(&&) = default和T& operator=(T&&) = defaultT(&&) noexcept {/* lot of code */}和T& operator=(T&&) noexcept {/* lot of code */}我知道这个问题相当主观,但你会选择什么?
假设您确实想要noexcept迁移,您可以通过以下任一方式减少选项 #3 的样板文件数量:
std::function,或者functionin。它只需要使用 swap 实现 move ctor 和赋值运算符,并默认其他所有内容。好的,您还需要公开function成员或转发函数调用运算符。