我在代码库中使用了一些构建器模式,我想知道按值返回是否应该比按引用返回更受欢迎,因为这是我对现代c++的感觉。在我看来,如果我应用按值返回的方法,这个例子将生成大量的副本。
class EmailBuilder
{
public:
EmailBuilder from(const string &from) {
m_email.m_from = from;
return *this;
}
EmailBuilder to(const string &to) {
m_email.m_to = to;
return *this;
}
EmailBuilder subject(const string &subject) {
m_email.m_subject = subject;
return *this;
}
EmailBuilder body(const string &body) {
m_email.m_body = body;
return *this;
}
operator Email&&() {
return std::move(m_email);
}
private:
Email m_email;
};
EmailBuilder Email::make()
{
return EmailBuilder();
}
int main()
{
Email mail = Email::make().from("me@mail.com")
.to("you@mail.com")
.subject("C++ builders")
.body("message");
}
我的问题是编译器是否会优化这里生成的许多副本。正如我所看到的,对于每个函数类,我们都生成一个构建器的新副本。
在许多情况下,按值返回更受欢迎,因为它通常避免了生命周期问题。这不是其中一种情况,因为构建器的生命周期通常是很好地定义和理解的。因此,应该支持通过引用返回。
同样,在c++ 20中你可以使用指定初始化式:
#include <string>
struct Email {
std::string from = "unknown";
std::string to = "unknown";
std::string subject = "unknown";
std::string body = "unknown";
};
int main() {
Email email = {
.from = "me@example.com",
.to = "you@example.com",
.body = "This is my email"
};
}
(见在线)
此处主题为"未知"。