在构建器类方法中*this的返回类型-左值对右值引用



假设我有一个" builder ";类B,它构建类C,看起来有点像下面的:

class B {
public:
// ...
B& set_foo(Foo a_foo) { foo_ = std::move(a_foo); return *this; }
C build() const { /* ... */ }
};

这一切都很好…直到我考虑当我的B实例是临时的会发生什么。我应该如何设计B工作,也作为临时/右值,而不仅仅是作为一个左值?

  • 我应该写一个set_foo() &&变体,返回B&&吗?这就意味着要复制很多方法,还有DRY。
  • 我应该返回B&&开始吗?
  • 我应该做点别的吗?

如果您碰巧使用c++ 23,则有一个称为的特性可以推导出这个,这将允许您完美地转发*this,甚至作为返回类型。

class B {
public:
// ...
template< typename Self >
decltype(auto) set_foo(this Self&& self, Foo a_foo)
//                       ^^^^^^^^^^^^^^^^ "this" can be specified as
//                                        a forwarding reference!
{
self.foo_ = std::move(a_foo);
return std::forward<Self>(self);
}
C build() const { /* ... */ }
};

在此代码中,返回类型将匹配*this是否为l值、r值、const和/或volatile

相关内容

  • 没有找到相关文章

最新更新