假设我有一个" 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
。