现代编译器在使用构建器模式时是否使用复制省略?



我在代码库中使用了一些构建器模式,我想知道按值返回是否应该比按引用返回更受欢迎,因为这是我对现代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"
};
}

(见在线)

此处主题为"未知"。

最新更新